Kontrollera en Roomba robot med Arduino och Android (6 / 8 steg)
Steg 6: Flytta Roomba runt
För rörlighet har Roomba 2 oberoende DC-motorer som kan vara programmerat att köra upp till 500mm/s. Det finns flera kommandon som kan användas för att köra roboten. De viktigaste är:
- Kod [137]: Köra == > måste skicka +/-hastighet i mm/s och +/-Radius i mm
- Kod [145]: Köra direkt == > måste sända vänster/höger fart i mm/s (+ för framåt och - för bakåt)
- Kod [146]: Kör PWM == > måste skicka +/-PWM data för vänster och höger hjul
Nedan koden för dessa 3 alternativ:
Ogiltig enhet (int hastighet, int radie)
{
klämman (hastighet,-500, 500); def högsta och lägsta hastighet i mm/s
klämman (radie,-2000, 2000). def max och min radius i mm
Roomba.write(137);
Roomba.write (velocity >> 8);
Roomba.write(Velocity);
Roomba.write (radie >> 8);
Roomba.write(RADIUS);
}
//---------------------------------------------------------------
void driveWheels (int rätt, int vänster)
{
klämma (rätt,-500, 500).
klämma (vänster,-500, 500);
Roomba.write(145);
Roomba.write (rätt >> 8);
Roomba.write(Right);
Roomba.write (vänster >> 8);
Roomba.write(Left);
}
//---------------------------------------------------------------
void driveWheelsPWM (int rightPWM, int leftPWM)
{
klämman (rightPWM,-255, 255);
klämman (leftPWM,-255, 255);
Roomba.write(146);
Roomba.write (rightPWM >> 8);
Roomba.write(rightPWM);
Roomba.write (leftPWM >> 8);
Roomba.write(leftPWM);
}
Observera att funktionen "klämma" definierar de högsta och lägsta värden som är högt till insatsen. Funktionen definieras i filen rombaDefines.h:
#define klämman (värde, min, max) (värdet < min? min: värde > max? max: värde)
Med hjälp av ovanstående kod, kan enklare funktioner skapas för att driva Roomba runt:
/---------------------------------------------------------------
void turnCW (osignerad kort hastighet, osignerade kort grader)
{
enhet (hastighet, -1);
klämma (hastighet, 0, 500);
Delay(6600);
fördröja ((1580 + 2.25*velocity)/hastighet * grader);
fördröjning ((-0.03159720835 * hastighet + 21.215270835) * grader);
Drive(0,0);
}
//---------------------------------------------------------------
void turnCCW (osignerad kort hastighet, osignerade kort grader)
{
enhet (hastighet, 1);
klämma (hastighet, 0, 500);
Delay(6600);
Delay(2708.3333/Velocity*Degrees);
fördröja ((1580 + 2.25*velocity)/hastighet * grader);
fördröjning ((-0.03159720835 * hastighet + 21.215270835) * grader);
Drive(0,0);
}
//---------------------------------------------------------------
void driveStop(void)
{
Drive(0,0);
}
//---------------------------------------------------------------
void driveLeft(int left)
{
driveWheels (vänster, 0);
}
//---------------------------------------------------------------
void driveRight(int right)
{
driveWheels (0, rätt);
}
Observera att argumentet "delay" för att stänga i vinkel, måste beräknas för en given hastighet
Nedan några exempel som kan användas för att testa motorerna:
turnCW (40, 180); snurra medurs 180 grader och stoppa
driveWheels (20, -20); Spin
driveLeft(20); svänger vänster
För att testa motorerna, det är bra att lägga till en extern tryckknapp (i mitt fall ansluten till Arduino stift 12), så du kan ladda ner koden till Arduino, börjar Roomba, men med stopp utförandet tills knappen trycks. Vanligtvis, för motorer testning kan du göra det på set-up delen av koden.
Som ett exempel, se enkla Arduino koden nedan:
#include "roombaDefines.h"
#include < SoftwareSerial.h >
Roomba Create2 anslutning
int rxPin = 10;
int txPin = 11;
SoftwareSerial Roomba(rxPin,txPin);
//---------------------------------------------
void setup()
{
Roomba.BEGIN(19200);
pinMode (ddPin, produktionen);
pinMode (buttonPin, INPUT_PULLUP); ansluten till Arduino stift 12 och används för att "starta"
Delay(2000);
wakeUp (); Wake-up Roomba
startSafe(); Starta Roomba i felsäkert läge
medan ({digitalRead(buttonPin))} / / wait knapp vara intryckt till kontinuerlig köra kod
turnCW (40, 180); o-kommentera om du vill testa Roomba spin viss 180 grader och stoppa
}
//---------------------------------------------
void loop()
{
}