Gör fast robotarm kanten till "Trådlös" med DIY Arduino + XBee (14 / 15 steg)
Steg 14: Arduino skiss & bearbetning kod
Följande är den Arduino skiss och bearbetning källkoden (både Arduino skiss och bearbetning är i samma zipfil nedan):
Om du använder denna skiss, ange baudvärde för din XBee enligt din XBee setup.
void setup() {
...
ändra baudfrekvens enligt din XBee, jag sätta min XBee till 115200.
Serial.BEGIN(115200);
...
}
=== Arduino skiss
Språk: Arduino
RobotArmControl.pde
//
av Sam Thongrong 26 Feb 2012
Rev.02
kontrollmatris kommandon:
{GripOut, låttexter GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
ShoulderUp, shoulderDown, BaseCW, BaseCCW, Benny, LightOff, Stop};
int styr [13] = {0x47, 0x67, 0x57, 0x77, 0x45, 0x65,
0x53, 0x73, 0x42, 0x62, 0x4c, 0x6c, 0x58};
Base
int baseEnablePin = 3;
int basePin1 = 16.
int basePin2 = 17;
Axel
int shoulderEnablePin = 14.
int shoulderPin1 = 2;
int shoulderPin2 = 4;
Armbåge
int elbowEnablePin = 6;
int elbowPin1 = 7.
int elbowPin2 = 15.
Handled
int wristEnablePin = 11;
int wristPin1 = 8;
int wristPin2 = 12;
Greppet
int gripEnablePin = 10;
int gripPin1 = 9;
int gripPin2 = 5;
int ledPin = 13.
Ange en variabel för att lagra den byte som skickats från den seriella porten
int incomingByte;
void setup() {
Ställ ljus LED
pinMode (ledPin, produktionen);
digitalWrite (ledPin, låg);
Ange SN754410 stiften som utgångar:
pinMode (basePin1, produktionen);
pinMode (basePin2, produktionen);
pinMode (baseEnablePin, produktionen);
pinMode (shoulderPin1, produktionen);
pinMode (shoulderPin2, produktionen);
pinMode (shoulderEnablePin, produktionen);
pinMode (elbowPin1, produktionen);
pinMode (elbowPin2, produktionen);
pinMode (elbowEnablePin, produktionen);
pinMode (wristPin1, produktionen);
pinMode (wristPin2, produktionen);
pinMode (wristEnablePin, produktionen);
pinMode (gripPin1, produktionen);
pinMode (gripPin2, produktionen);
pinMode (gripEnablePin, produktionen);
börja skicka data på 115200 baud
Jag ställa min Xbee överföringshastigheten 115200 bps,
ändra baudfrekvens enligt din XBee
Serial.BEGIN(115200);
}
void loop() {
Kontrollera att det finns något i den seriella bufferten
om (Serial.available() > 0) {
Läs byten och lagra den i vår variabel
den byte som skickas är faktiskt ett ASCII-värde
incomingByte = Serial.read();
Observera det övre höljet på varje bokstav!
varje bokstav vänder sig motor annorlunda.
=== Grepp
Grepp i
om (incomingByte == controls[0]) {
gripIn();
}
Tag ut
om (incomingByte == controls[1]) {
gripOut();
}
Handled
om (incomingByte == controls[2]) {
digitalWrite (wristPin1, låg);
digitalWrite (wristPin2, hög);
wristUp();
}
om (incomingByte == controls[3]) {
wristDown();
}
=== Armbåge
Armbåge upp
om (incomingByte == controls[4]) {
elbowUp();
}
Armbåge ned
om (incomingByte == controls[5]) {
elbowDown();
}
=== Axel
Ta upp
om (incomingByte == controls[6]) {
shoulderUp();
}
Ta ner
om (incomingByte == controls[7]) {
shoulderDown();
}
=== Base
Base rätt
om (incomingByte == controls[8]) {
baseRight();
}
Base vänster
om (incomingByte == controls[9]) {
baseLeft();
}
Ljus på
om (incomingByte == controls[10]) {
digitalWrite (ledPin, hög);
}
Ljus av
om (incomingByte == controls[11]) {
digitalWrite (ledPin, låg);
}
om en O skickas göra är säker motorerna avstängda
om (incomingByte == controls[12]) {
allStop();
}
Delay(100);
}
}
void gripIn() {
digitalWrite (gripEnablePin, hög);
digitalWrite (gripPin1, låg);
digitalWrite (gripPin2, hög);
}
void gripOut() {
digitalWrite (gripEnablePin, hög);
digitalWrite (gripPin2, låg);
digitalWrite (gripPin1, hög);
}
void wristUp() {
digitalWrite (wristEnablePin, hög);
digitalWrite (wristPin1, låg);
digitalWrite (wristPin2, hög);
}
void wristDown() {
digitalWrite (wristEnablePin, hög);
digitalWrite (wristPin2, låg);
digitalWrite (wristPin1, hög);
}
void elbowUp() {
digitalWrite (elbowEnablePin, hög);
digitalWrite (elbowPin1, låg);
digitalWrite (elbowPin2, hög);
}
void elbowDown() {
digitalWrite (elbowEnablePin, hög);
digitalWrite (elbowPin2, låg);
digitalWrite (elbowPin1, hög);
}
void shoulderUp() {
digitalWrite (shoulderEnablePin, hög);
digitalWrite (shoulderPin1, låg);
digitalWrite (shoulderPin2, hög);
}
void shoulderDown() {
digitalWrite (shoulderEnablePin, hög);
digitalWrite (shoulderPin2, låg);
digitalWrite (shoulderPin1, hög);
}
void baseRight() {
digitalWrite (baseEnablePin, hög);
digitalWrite (basePin1, låg);
digitalWrite (basePin2, hög);
}
void baseLeft() {
digitalWrite (baseEnablePin, hög);
digitalWrite (basePin2, låg);
digitalWrite (basePin1, hög);
}
void allStop() {
digitalWrite (baseEnablePin, låg);
digitalWrite (basePin1, låg);
digitalWrite (basePin2, låg);
digitalWrite (shoulderEnablePin, låg);
digitalWrite (shoulderPin1, låg);
digitalWrite (shoulderPin2, låg);
digitalWrite (elbowEnablePin, låg);
digitalWrite (elbowPin1, låg);
digitalWrite (elbowPin2, låg);
digitalWrite (wristEnablePin, låg);
digitalWrite (wristPin1, låg);
digitalWrite (wristPin2, låg);
digitalWrite (gripEnablePin, låg);
digitalWrite (gripPin1, låg);
digitalWrite (gripPin2, låg);
}
=== Arduino slutet
Följande är källkoden bearbetning. You'ill behöver den bakgrund bild arkivera, och alla knappar bild arkivera för att se dessa knappar på skärmen.
Och alla bakgrunden och knappar finns ad finns i mappen kallas data. Du måste ha denna mapp i samma mapp i bearbetning-koden (RobotArmControl.pde)
Språk: bearbetning
RobotArmControl.pde
av Sam Thongrong 26 Feb 2012
läsa in följetong för bearbetning
import processing.serial.*;
förekomst av klassen följetong
Seriell port;
kontrollmatris kommandon:
GripOut, låttexter GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
ShoulderUp, shoulderDown, BaseCW, BaseCCW, Benny, LightOff, stopp
int [] kontroller = nya int [] {
0x47, 0x67, 0x57, 0x77, 0x45, 0x65,
0x53, 0x73, 0x42, 0x62, 0x4c, 0x6c, 0x58};
Bild-knapp.
Läsa in bilder och använda dem för att skapa en knapp.
ImageButtons låttexter GripIn;
ImageButtons GripOut;
ImageButtons WristUp;
ImageButtons WristDown;
ImageButtons ElbowUp;
ImageButtons ElbowDown;
ImageButtons ShoulderUp;
ImageButtons ShoulderDown;
ImageButtons BaseCW;
ImageButtons BaseCCW;
ImageButtons Benny;
ImageButtons LightOff;
ImageButtons Pause;
bakgrund
PImage bg;
ange teckensnitt
PFont myFont;
void controlGUI()
{
BG = loadImage("background.jpg");
Background(BG);
int buttonSize = 44.
PImage valt = loadImage("controlSel.png");
Grepp i
PImage gripInImage = loadImage("controlIn.png");
PImage gripInOver = loadImage("controlInOver.png");
Låttexter gripIn = nya ImageButtons (30, 83, buttonSize, buttonSize,
gripInImage, gripInOver, valt);
Tag ut
PImage gripOutImage = loadImage("controlOut.png");
PImage gripOutOver = loadImage("controlOutOver.png");
GripOut = ny ImageButtons (78, 83, buttonSize, buttonSize,
gripOutImage, gripOutOver, valt);
Handleden upp
PImage wristUpImage = loadImage("controlUp.png");
PImage wristUpOver = loadImage("controlUpOver.png");
WristUp = ny ImageButtons (150, 36, buttonSize, buttonSize,
wristUpImage, wristUpOver, valt);
Handleden ner
PImage wristDownImage = loadImage("controlDown.png");
PImage wristDownOver = loadImage("controlDownOver.png");
WristDown = ny ImageButtons (198, 36, buttonSize, buttonSize,
wristDownImage, wristDownOver, valt);
Armbåge upp
PImage elbowUpImage = loadImage("controlUp.png");
PImage elbowUpOver = loadImage("controlUpOver.png");
ElbowUp = ny ImageButtons (258, 83, buttonSize, buttonSize,
elbowUpImage, elbowUpOver, valt);
Armbåge ned
PImage elbowDownImage = loadImage("controlDown.png");
PImage elbowDownOver = loadImage("controlDownOver.png");
ElbowDown = ny ImageButtons (306, 83, buttonSize, buttonSize,
elbowDownImage, elbowDownOver, valt);
Ta upp
PImage shoulderUpImage = loadImage("controlUp.png");
PImage shoulderUpOver = loadImage("controlUpOver.png");
ShoulderUp = ny ImageButtons (208, 160, buttonSize, buttonSize,
shoulderUpImage, shoulderUpOver, valt);
Ta ner
PImage shoulderDownImage = loadImage("controlDown.png");
PImage shoulderDownOver = loadImage("controlDownOver.png");
ShoulderDown = ny ImageButtons (256, 160, buttonSize, buttonSize,
shoulderDownImage, shoulderDownOver, valt);
Base CW
PImage baseCWImage = loadImage("controlCW.png");
PImage baseCWOver = loadImage("controlCWOver.png");
BaseCW = ny ImageButtons (130, 234, buttonSize, buttonSize,
baseCWImage, baseCWOver, valt);
Base CCW
PImage baseCCWImage = loadImage("controlCCW.png");
PImage baseCCWOver = loadImage("controlCCWOver.png");
BaseCCW = ny ImageButtons (178, 234, buttonSize, buttonSize,
baseCCWImage, baseCCWOver, valt);
Ljus på
PImage lightOnImage = loadImage("LightOn.png");
PImage lightOnOver = loadImage("LightOnOver.png");
LightOn = nya ImageButtons (30, 184, buttonSize, buttonSize,
lightOnImage, lightOnOver, valt);
Ljus av
PImage lightOffImage = loadImage("LightOff.png");
PImage lightOffOver = loadImage("LightOffOver.png");
LightOff = ny ImageButtons (78, 184, buttonSize, buttonSize,
lightOffImage, lightOffOver, valt);
}
void setup() {
Lista alla tillgängliga seriella portar i panelen Ljud ut.
Måste du välja den port som Arduino styrelsen är
ansluten till från den här listan. Den första porten i listan är
Port #0 och tredje porten i listan är port #2.
println(Serial.list());
Öppna porten som Arduino styrelsen är ansluten till
(i detta fall #0)
Se till att öppna porten med samma hastighet Arduino är
med (112500bps)
Port = ny följetong (denna, Serial.list() [1], 112500);
På fönstret PC, använda "Utgående" av bluetooth-enheten
Här en för XBee
Port = ny följetong (här, "COM30", 115200);
skärmstorleken på programmet
storlek (145, 455);
storlek (400, 300);
Smooth();
testa ellips
ellipseMode(RADIUS);
textFont (createFont ("Verdana", 14));
controlGUI();
}
void updateDisplay() {
GripIn.update();
GripIn.display();
GripOut.update();
GripOut.display();
WristUp.update();
WristUp.display();
WristDown.update();
WristDown.display();
ElbowUp.update();
ElbowUp.display();
ElbowDown.update();
ElbowDown.display();
ShoulderUp.update();
ShoulderUp.display();
ShoulderDown.update();
ShoulderDown.display();
BaseCW.update();
BaseCW.display();
BaseCCW.update();
BaseCCW.display();
LightOn.update();
LightOn.display();
LightOff.update();
LightOff.display();
}
Skicka kommandon
void sendCommands() {
Greppet
IF(GripIn.Pressed) {
port.write(Controls[0]);
println ("grepp i:" + (char)controls[0]);
}
IF(GripOut.Pressed) {
port.write(Controls[1]);
println ("grepp ut:" + (char)controls[1]);
}
om (mouseX > 30 & & mouseX < 129 & &
mouseY > 51 & & mouseY < 79) {
port.write(Controls[12]);
println ("Grepp stopp!" + (char)controls[12]);
}
Handled
IF(WristUp.Pressed) {
port.write(Controls[2]);
println ("handled upp:" + (char)controls[2]);
}
IF(WristDown.Pressed) {
port.write(Controls[3]);
println ("handleden ner:" + (char)controls[3]);
}
om (mouseX > 148 & & mouseX < 248 & &
mouseY > 5 & & mouseY < 33) {
port.write(Controls[12]);
println ("Handled stopp!" + (char)controls[12]);
}
Armbåge
IF(ElbowUp.Pressed) {
port.write(Controls[4]);
println ("armbåge upp:" + (char)controls[4]);
}
IF(ElbowDown.Pressed) {
port.write(Controls[5]);
println ("armbåge ned:" + (char)controls[5]);
}
om (mouseX > 258 & & mouseX < 358 & &
mouseY > 51 & & mouseY < 79) {
port.write(Controls[12]);
println ("Armbåga stopp!" + (char)controls[12]);
}
Axel
IF(ShoulderUp.Pressed) {
port.write(Controls[6]);
println ("knuffa upp:" + (char)controls[6]);
}
IF(ShoulderDown.Pressed) {
port.write(Controls[7]);
println ("knuffa ner:" + (char)controls[7]);
}
om (mouseX > 208 & & mouseX < 308 & &
mouseY > 130 & & mouseY < 158) {
port.write(Controls[12]);
println ("Axel stopp!" + (char)controls[12]);
}
Base
IF(BaseCW.Pressed) {
port.write(Controls[8]);
println ("Base rotera CW:" + (char)controls[8]);
}
IF(BaseCCW.Pressed) {
port.write(Controls[9]);
println ("Base rotera CCW:" + (char)controls[9]);
}
om (mouseX > 130 & & mouseX < 230 & &
mouseY > 202 & & mouseY < 230) {
port.write(Controls[12]);
println ("Bas stopp!" + (char)controls[12]);
}
Ljus
IF(LightOn.Pressed) {
port.write(Controls[10]);
println ("ljus på:" + (char)controls[10]);
}
IF(LightOff.Pressed) {
port.write(Controls[11]);
println ("ljus ut:" + (char)controls[11]);
}
}
void draw()
{
updateDisplay();
sendCommands();
}
Knappen & ImageButtons klasser
klass knappen
{
int x, y;
int w, h;
färg basecolor, highlightcolor;
färg currentcolor;
booleska över = false;
Boolean tryckte = false;
void pressed() {
om (över & & mousePressed) {
tryckte = sant;
} annat {
tryckte = false;
}
}
booleska overRect (int x, int y, int bredd, int höjd) {
om (mouseX > = x & & mouseX < = x + bredd & &
mouseY > = y & & mouseY < = y + höjd) {
return true;
} annat {
returnera false;
}
}
}
klassen ImageButtons utökar knappen
{
PImage bas;
PImage rullen.
PImage ner;
PImage currentimage;
ImageButtons (int ix, iy int, int iw, int ih,
PImage ibase, PImage iroll, PImage idown)
{
x = ix.
y = iy;
w = iw;
h = ih;
bas = ibase;
rulle = iroll;
ned = idown;
CurrentImage = bas;
}
void update()
{
over();
Pressed();
IF(Pressed) {
CurrentImage =.
} else om (över) {
CurrentImage = rullen.
} annat {
CurrentImage = bas;
}
}
void over()
{
om (overRect (x, y, w, h)) {
över = sant;
} annat {
över = false;
}
}
void display()
{
bild (currentimage, x, y);
}
}
Bearbeta slutet
För att styra robotarm motor, flyttar du markören till önskat knappen och klicka.
För att stoppa driften bara flytta markören till någon etikett. Roboten kommer att sluta.
Flytta markören till de knappar som krävs för att driva flera motorer på en gång, och på dessa knappar.
Men dra inte markören passerar över etiketterna, som gör att driften att stoppa
Njut!.