PlankTrick

Uit RobotMC.be
Versie door Jsuijs (overleg | bijdragen) op 19 jan 2018 om 19:39
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Ga naar: navigatie, zoeken
PlankTrick schema.jpg

In augustus 2014 was ik begonnen met een robot 'PlanckTrick' genaamd die bestond uit een paars platform van Aloys, twee tweedehandsmotoren van Joep (Portescap 22n28 210e D16 5). Ik had nog een STM32VLDiscovery bordje liggen en wat Sharp sensoren en wat spullen uit mijn voorraaddoos en wat knutselen had ik een werkende robot klaar. Het was echter eerder gepruts dan geknutsel en PlanckTrick heeft nooit echt stabiel gewerkt. Ook de STM32VLDiscovery was wat krap voor RobotLib en dan vooral het RAM gedeelte. Toen hij op 1 november 2015 finaal de geest gaf, leek dit experiment voorbij. Dankzij Joep is echter PlankTrick (zonder de 'c' deze keer) uit de as verrezen in een verbeterde en vooral stabiele versie : STM32F4Discovery bord met 1Mb Flash en 192K RAM, een kleinere motorcontroller, een kleinere step-down converter, de nodige condensators en vooral deftig gebouwd. Dit alles resulteerde in een robot conform het 'referentieplatform' van RobotLib. In de foto zie je het schema van de belangrijkste zaken van PlankTrick, maar in essentie is het deze hardware.

Op deze pagina wil ik je mee begeleiden doorheen het software traject van PlankTrick met de bedoeling stap voor stap een robot op te bouwen die aan Roborama kan meedoen. Gedurende het traject wil ik je ook enkele principes van RobotLib uitleggen zodat je zelf snel aanpassingen en uitbreidingen kan maken. Het is geen echte tutorial, maar eerder mijn weg doorheen Robotlib van vallen en opstaan, maar dan zonder het vallen.

Hardware configuratie

Onderdelenlijst

  • Processor : STM32F4Discovery [1] : 32 bits, 1Mb flash, 192K RAM, 168Mhz (denk ik)
  • Voeding : LiPo 4 cells, 2200 mAh [2] : 4 cellen geven tussen de 14.2 en 16.8 volt. Perfect voor mijn motoren, maar veel te hoog voor de processor. Om de spanning te reduceren gebruikte Joep een step-down converter ????? naar 8V en dan een 7805 voor het logische gedeelte zoals de voeding van het processorbord en de motorcontroller.
  • Motoren : 2xPortescap 22n28 210e D16 5 [3]
  • Motorsturing : ???? De spanningsval is 3V, wat de batterijspanning verlaagt naar 11.2...13.8V wat perfect is voor deze 12V motoren.
  • HC-05 Bluetooth module [4]. Deze werkt op 3.3V, ideaal voor de STM32, maar voor andere processoren opletten dat je op de RX poort een spanningsdeler zet.
  • RC5 ontvanger : TSOP36 [5] en een oude Philips afstandsbediening
  • LCD display : ik koos voor een 16x2 LCD tekst-display zonder backlight (HD44780 compatibel) maar wel met een I²C interface module om pinnen te besparen [6]
  • I²C level converter : omdat de STM32 op 3.3V werkt en het LCD display op 5V besloot ik er een level shifter tussen te zetten. Deze is niet strikt nodig, maar wel 'veiliger') [7]
  • 3x Sharp GP2D12 afstandssensor (10-80cm) met een 10uF elco over de + en - recht op de pinnen van de afstandssensor zelf
  • Polulu QTR-8A 8xIR sensor [8] voor de lijnvolger met een MAX127 als I²C interface om datalijnen te sparen

PIN-aansluitingen

Onder het motto 'blijf op bewandelde paden', besloot Joep dezelfde pin-layout te gebruiken als in het referentieplatform.

Rlib hw 03.jpg

Software Library : RobotLib

Joep heeft een mooie software library online gezet : RobotLib waar hij met een vergelijkbare configuratie een robot heeft gebouwd. De library is in lagen opgebouwd die het mogelijk maakt om andere processoren, andere motoren, ander platformen te gebruiken en door ze juist te configureren te integreren zodat de rest van je code niet moet aangepast worden. Verder is al heel wat voor jou bedacht : RC5 decoder, command-line interface, calibratieroutines, het programmeren van een "mission" door verschillende toestanden na elkaar te zetten enz.... Kortom, het wiel bestond al, waarom dan zelf iets bouwen? Ik ga hier niet herhalen wat je kan lezen in de documentatie van RobotLib maar toch is het nuttig te beschrijven wat ik moest aanpassen om alles werkend te krijgen denk ik voor anderen (en mezelf binnen 3 maand).

Stap 1 : "Hello World"

Bespaar jezelf een hoop ellende en doe gewoon wat Joep op deze pagina beschrijft. Als je alles tot en met de stap "Test" succesvol aan de praat krijgt, ben je al een heel eind gevorderd.
>> Herlees vorige 2 zinnen 3x
Toen dit werkte kreeg ik een hoop informatie op het scherm van m'n PC (via bluetooth) en kon ik commando's van de commando lijn ingeven (bv : '?' geeft je een lijst van beschikbare commandos) en als ik op mijn afstandsbediening een knop indrukte kreeg ik netjes de waarde van die knop op het scherm te zien. Alles gratis en voor niks -toegegeven - mits wat geknutsel, maar in elk geval heel wat minder werk dan zelf een wiel proberen uit te vinden. Belangrijk voordat je verder gaat is dat je console (UART) werkt omdat je die echt wel zal nodig hebben om alles te calibreren.

Stap 2 : Afstandsbediening

RobotLib bevat de nodige routines om een RC5 afstandsbediening uit te lezen. Meer nog, er zit zelfs de nodige code in om functies aan knoppen te linken en reeds een heleboel test programma's voorgeprogrammeerd. Je moet wel de juiste mapping doen tussen de toets op je afstandsbediening en de gewenste functie-code. Niet zo moeilijk als het klinkt.

  • Toetscodes bepalen : Simpel. Gewoon de console openen, het commando 'dset 2' ingeven (debug RC5) en dan de toetsen drukken die je wenst. Je zal dan dingen zien zoals verschijnen zoals 'D02: Rc5RxWord : 4430 / 0x114e (29006/0x714e) Unhandled RC5 code 4430'. Je schrijft de toets en de bijhorende code even op, in dit voorbeeld 4430.
  • Mapping tussen toets en functie : Dit alles kan je regelen door in het bestand Prj_RobotLib_conf.h de constanten RC_xxxxx naar de juiste code te mappen die je in de vorige stap opschreef. Constantes die je niet gebruikt of wil mappen, geef je een waarde die je afstandsbediening niet kan genereren, maar zorg wel dat elk getal maar 1 keer voorkomt. Deze constanten worden in een grote case gebruikt en als een waarde 2x voorkomt krijg je een compilatiefout.
  • Test missies :
    • Bij het opstarten is de groep "DemoUmbMark1" aan de afstandsbediening gekoppeld. Deze bevat 3 'missies' die gekoppeld zijn aan je afstandsbediening. RC_F01 is "UmbMark1 Linksom". RC_F02 is "UmbMark1 Rechtsom". RC_F10 is "Stop". Met de toets 9 activeer je de volgende groep missies (als die bestaat). In RobotLib taal heet dit de volgende 'PfKeyHandler'
    • Om de robot te calibreren verander je in "main.cpp" de oproep 'PFKeyHandlerSet(FP_FNAME(PFKeyUmbMark1))' in 'PFKeyHandlerSet(PFKeyMotorCalibrate1, "MotorCalibrate1")'
    • Je kan met de UP / DOWN toets die je definieerde op de LCD display verschillende waardes uitlezen : afstand, hoek, x en y positie, linkse en rechtse sharp sensor (= adc 1 en 2 ?).

Tip1 : Je kan natuurlijk ook lui zijn zoals ik : zet het bestand in de editor en de console naast elkaar op het scherm en je kan direct de code intypen. Dit heeft als voordeel dat je ziet welke codes je nodig hebt en je kan in de commentaar direct zeggen welk label de toets op de afstandsbediening heeft. Gegarandeerd dat je dit later handig gaat vinden.

Tip 2 : Je kan de functie-toetsen 0..9 van je afstandsbediening emuleren door in de console het commando 'pf 0' tot 'pf 9' in te typen.

Stap 3 : Motorcalibratie

Alles wordt perfect uitgelegd op deze pagina. De gebruikte pinnen van je processor kan je definieren in het bestand 'Prj_Hal_conf.h', maar doordat ik dezelfde layout gebruikte als Joep was dat niet nodig. Nadat de hardware fouten opgelost waren (slechte verbinding, links en rechts verwisseld) was het tijd om de motoren te configureren en calibreren. Doordat ik dezelfde pin-layout gebruikt had deden mijn motoren het een beetje, maar niet volledig. De code was voor pittmann motoren, ik had de portescap motoren. We gaan nu de commando lijn op de seriele terminal gebruiken om commando's aan onze robot te geven. Voer eerst het commando "addtests" uit zodat je extra functies ter beschikking krijgt

  • Vooruit/Achteruit & PWM : 'umpwm x y'  : dit is een belangrijk commando om te zien dat je motoren in de juiste richting draaien en om te zien of PWM werkt. Als dat niet zo is, moet je in het bestand prj_Hal_motors.cpp de functie PrjMotorPwm aanpassen. Ik moest het teken omwisselen op de lijn 82 'int Pwm = -PwmL; // flip direction here if required.' om de juiste draairichting te hebben en negatieve PWM waardes inverteren om bij kleine getallen de motor traag te laten draaien, bij grote getallen snel op lijn 88 'Pwm = (4095+Pwm);' Eventueel hetzelfde doen voor de rechter motor. Hier te commando's om alles te testen.
    • umpwm 1000 0 : nu moet de linker motor traag vooruit draaien
    • umpwm -1000 0 : nu moet de linker motor traag achteruit draaien
    • umpwm (+/-)4000 0 : nu moet de linker motor snel vooruit(4000)/