Dane techniczne:
Wymiary: dł. 38s (bez masztu) / szer. 22s (bez masztu), wys. 22s
Waga: 1.565 kg
Zawieszenie: brak
Napęd: na przednią oś silnikiem PF XL z redukcją 1.4:1
Silniki: 2 x PF XL, 3 x PF Medium, 2 x Micromotor
Przedstawiam model reach stackera, czyli maszyny która po polsku nie wiem jak się nazywa, ale na logikę powinna nazywać się podnośnikiem kontenerów albo czymś podobnym. Maszyny tego rodzaju są generalnie dalekimi krewnymi telehandlerów o dość wąskiej specjalizacji: używa się ich w terminalach przeładunkowych portów do transportu kontenerów. Co ciekawe, większość czołowych europejskich producentów nie ma takich maszyn w swojej ofercie, z wyjątkiem Liebherra który robi je z łukowato wygiętym bomem, co skutecznie wyleczyło mnie z chęci wzięcia ich stackerów na wzór. Pomysł na taką maszynę chodził za mną od lat i w końcu zmusiłem się do realizacji.
Model miał być z założenia możliwie mały, prosty i funkcjonalny. Wygląd był kompletnie drugorzędny, nie starałem się też odwzorować żadnego konkretnego modelu. Zawieszenia brak - nie byłem w stanie doszukać się czy prawdziwe stackery mają zawieszenie, ale biorąc pod uwagę że są przeznaczone do poruszania się wewnątrz portów po płaskim asfalcie, to chyba mogą obyć się bez niego.
Jeśli chodzi o funkcje, oprócz napędu przedniej osi i skrętu tylnej mamy podnoszenie bomu dwoma siłownikami śrubowymi, wysuwanie bomu, obracanie głowicy i rozsuwanie szczęk. Dwie ostatnie funkcje realizują micromotory zlokalizowane na samej głowicy i kontrolowane przez kable przechodzące przez bom. Tak jak w prawdziwych maszynach, głowica ma się poziomować pod własnym ciężarem, stąd po jednej jej stronie znajduje się micromotor z prostym mechanizmem rozsuwania szczęk, a z drugiej obciążony klocek dla jego zrównoważenia.
Funkcją którą po długim namyśle wykreśliłem jest przechylanie głowicy. Prawdziwe stackery mogą ją przechylać do przodu, co patrząc na filmy z ich pracy jest funkcją używaną rzadko i z pewną taką nieśmiałością. Ponieważ nie wydawała mi się ona specjalnie potrzebna, a za to tworzyła masę problemów technicznych - np. ciągnięcie przez bom kolejnego kabla do kolejnego silnika, albo przewodów pneumatycznych, ewentualnie rozciąganego wału napędowego - ostatecznie ją zignorowałem. Dodałem za to prosty mechanizm podnoszenia kabiny, który wypadł fatalnie bo z racji małej ilości dostępnego miejsca ma skromniutki zakres ruchu.
Model jest zbudowany całkowicie z liftarmów, z wyjątkiem boków kadłuba które składają się z bricków przypiętych do ramy i wzmacniających ją na krytycznym odcinku między punktem podparcia bomu a punktem podparcia siłowników. Ogólnie model ma solidne podwozie i bom, oraz dość ażurową głowicę i szczęki. Mimo tego podźwignął prawie pół kilograma ładunku, a punktem krytycznym okazał się PF XL oraz sprzęgła w siłownikach śrubowych, jak można zobaczyć na filmie.
Model był również moją pierwszą okazją pobawienia się IR Linkiem - chciałem być drugim Emilusem i zbudowałem sobie pilota NXT z joystickiem i dwoma trybami pracy: do jazdy i do operowania bomem. Niestety, okazało się że IR Link ma nawet gorszy zasięg niż piloty PF i do tego potężne opóźnienia. Mimo wszystko pilot działał, a prosty program który do niego spłodziłem zamieszczam poniżej:
Kod: Zaznacz cały
#pragma config(Sensor, S1, HTIRL, sensorI2CCustom)
#pragma config(Sensor,S3,touch1,sensorTouch)
#pragma config(Sensor,S4,touch2,sensorTouch)
#include "drivers/HTIRL-driver.h"
bool sending = false;
bool drivemode = true;
tPFmotor DriveMotor = pfmotor_S1_C1_A;
tPFmotor SteeringMotor = pfmotor_S1_C1_B;
tPFmotor BoomElevationMotor = pfmotor_S1_C2_A;
tPFmotor BoomExtensionMotor = pfmotor_S1_C2_B;
tPFmotor CabinMotor = pfmotor_S1_C3_A;
tPFmotor HeadCatchMotor = pfmotor_S1_C4_A;
tPFmotor HeadRotationMotor = pfmotor_S1_C4_B;
task Buttons()
{
nNxtButtonTask = -2;
nNxtExitClicks = 2;
nxtDisplayCenteredTextLine(0, "Not sending...");
while(true)
{
if(nNxtButtonPressed == 3)
{
PlaySound(soundBeepBeep);
if(sending == false){
sending = true;
nxtDisplayCenteredTextLine(0, "Sending...");
}
else{
sending = false;
nxtDisplayCenteredTextLine(0, "Not sending...");
}
}
if(nNxtButtonPressed == 1)
{
drivemode = false;
nxtDisplayCenteredTextLine(2, " DRIVE [BOOM]");
}
if(nNxtButtonPressed == 2)
{
drivemode = true;
nxtDisplayCenteredTextLine(2, "[DRIVE] BOOM ");
}
if(nNxtButtonPressed == 0)
{
sending = false;
PlaySound(soundBeepBeep);
wait1Msec(400);
PFMotor(DriveMotor, 0);
PFMotor(SteeringMotor, 0);
PFMotor(BoomElevationMotor, 0);
PFMotor(BoomExtensionMotor, 0);
PFMotor(HeadCatchMotor, 0);
PFMotor(HeadRotationMotor, 0);
PFMotor(CabinMotor, 0);
StopAllTasks();
}
wait1Msec(400);
}
}
task main()
{
StartTask(Buttons);
nxtDisplayCenteredTextLine(2, "[DRIVE] BOOM ");
int LeftMotor = 0;
int RightMotor = 0;
int UpperMotor = 0;
int RightButtons = 0;
while (true) {
if(drivemode == true)
{
LeftMotor = (nMotorEncoder[motorA] / 7) * -1;
if (LeftMotor > 7) LeftMotor = 7;
else if (LeftMotor < -7) LeftMotor = -7;
RightMotor = (nMotorEncoder[motorC] / 10) * -1;
if (RightMotor > 2) RightMotor = 2;
else if (RightMotor < -2) RightMotor = -2;
if (SensorValue(touch1) == 1) RightButtons = 7;
else if (SensorValue(touch2) == 1) RightButtons = -7;
else RightButtons = 0;
nxtDisplayTextLine(4, "Left motor: %d", LeftMotor);
nxtDisplayTextLine(5, "Right motor: %d", RightMotor);
nxtDisplayTextLine(6, "Buttons: %d", RightButtons);
nxtDisplayClearTextLine(7);
if (sending == true)
{
PFMotor(DriveMotor, LeftMotor);
PFMotor(SteeringMotor, RightMotor);
PFMotor(CabinMotor, RightButtons);
}
}
else
{
LeftMotor = nMotorEncoder[motorA] / 20;
if (LeftMotor > 0) LeftMotor = 7;
else if (LeftMotor < 0) LeftMotor = -7;
UpperMotor = nMotorEncoder[motorB] / 20;
if (UpperMotor > 0) UpperMotor = 7;
else if (UpperMotor < 0) UpperMotor = -7;
RightMotor = (nMotorEncoder[motorC] / 20) * -1;
if (RightMotor > 0) RightMotor = 7;
else if (RightMotor < 0) RightMotor = -7;
if (SensorValue(touch1) == 1) RightButtons = 7;
else if (SensorValue(touch2) == 1) RightButtons = -7;
else RightButtons = 0;
nxtDisplayTextLine(4, "Left motor: %d", LeftMotor);
nxtDisplayTextLine(5, "Right motor: %d", RightMotor);
nxtDisplayTextLine(6, "Upper motor: %d", UpperMotor);
nxtDisplayTextLine(7, "Buttons: %d", RightButtons);
if (sending == true)
{
PFMotor(BoomExtensionMotor, LeftMotor);
PFMotor(BoomElevationMotor, UpperMotor);
PFMotor(HeadRotationMotor, RightMotor);
PFMotor(HeadCatchMotor, RightButtons);
}
}
wait1Msec(200);
}
}
Galeria: http://www.brickshelf.com/cgi-bin/gallery.cgi?f=500743
I obowiązkowy film, tym razem z roli spasionego gryzonia występuje Kulka:
[youtube]http://www.youtube.com/watch?v=M_mBMhGTnrg[/youtube]