Machen Sie mit DIY Arduino + XBee Wired Robotic Arm Edge zu "Wireless"

Machen Sie mit DIY Arduino + XBee den Wired Robotic Arm Edge zu "Wireless" - in 15 Schritten


UPDATE: Schaltplan, Top Layer PCB, Bottom Layer PCB und beide Top, Bottom PCB Images hinzugefügt

Als ich mit dem "RevIO" fertig war - einem Arduino-Klon, der die Verwendung von Pins auf andere Weise enthüllt. Ich beschloss, weiter zum nächsten Projekt zu gehen. Um mein "RevIO" Board zu testen, dass es die größere Aufgabe erfüllen kann, als nur die LED zu blinken!

Ich habe den Wired Robotic Arm Edge mithilfe meiner "RevIO" - und DIY-Drei-Motor-Treiber-ICs zusammen mit dem XBee Series 1-Modul auf drahtlos gesteuert umgestellt.

Diese Anleitung beschreibt, wie ich die Leiterplatte der Drei-Motor-Treiber-ICs von Grund auf neu aufgebaut habe. Dann benutze ich es als "Huckepack" auf meinem "RevIO" Board.

Um den Roboterarm zu steuern, habe ich die GUI (Graphical User Interface) mit der Processing auf dem PC und der Arduino-Skizze zum Antrieb der Motoren entworfen.

Ich habe auch die 6-polige Buchse als Alternative zur Verwendung des Bluetooth-Moduls hinzugefügt (Sparkfuns Bluetooth-Modem - Blue SMiRF Silver oder Bluetooth-Modem - Blue SMIRF Gold).

Ich werde wieder die gleiche Präsentationsmethode wie Build "The RevIO" (Arduino Clone) My Way verwenden, um die Platine unter Verwendung der grafischen Illustrationen zusammen mit den Fotos des tatsächlichen Aufbaus der Platine zu erstellen.

Zubehör:

Schritt 1: Bauen Sie den Roboterarmrand auf

Ich habe vor drei Monaten das Robotic Arm Edge Kit von TPE Shop in Thailand bekommen, als ich meine Familie in Thailand besuchte. Aber ich tat es nicht, bis ich einen Monat später in die USA zurückkehrte.

Dies ist mein allererster Roboterarm, mit dem ich jemals in Berührung gekommen bin. Eine Woche nach meiner Rückkehr begann ich mit dem Bau des Bausatzes. Ich verbringe ungefähr vier Stunden damit, Fotos für diese instructables zu machen.

Ich werde Ihnen nicht zeigen, wie ich das Kit zusammengestellt habe, aber hier ist die Collage, wie ich den Roboterarm von Anfang bis Ende zusammengestellt habe!

Schritt 2: Teile

IC1, IC2, IC3 H-Brückentreiber 1A, SN754410 (Sparkfun # COM-00315) oder L293D (Digikey # 497-2936-5-ND)
R1 - 1K Widerstand (Radio Shack # 271-1321 oder Digkey # PPC1.0KW-1CT-ND)
LED1 - 3 mm rote LED (Digikey # 160-1708-ND)
S1 - DPDT-Schiebeschalter (Digikey # 401-2000-ND)
JP1 - 2x6 Stiftleiste, gerade
JP2, JP3 - (2) 14-polige Stiftleiste, extra langer Stift oder Shield Stacking-Stiftleisten (Adafruit ID # 85)
JP4 - 2-poliger Stiftleistenstecker, rechtwinklig
JP5 - 6-poliger Buchsenstecker, rechtwinklig
16-poliger IC-Sockel (Radio Shack # 276-1998)
Mehrzweck-PC-Platine mit 417 Löchern (Radio Shack # 276-150)
Draht

Der RevIO oder irgendeine Art von Arduino
Hinweis: Wenn Sie Arduino oder einen anderen Arduino-Klon verwenden, müssen Sie die Motorsteuerplatine an diese Arduino anpassen.

Andere Teile:
2 XBee-Module Ich habe die Serie 1 von AdaFruit erhalten
2 Xbee Adapter Board von AdaFruit

Alternativel Teil:
Bluetooth-Modem - Blau SMiRF Gold (Sparkfun # WRL-10268)
oder Bluetooth Modem - Blau SMiRF Silber (Sparkfun # WRL-10269)

Schritt 3: Layout & Schema

Wie im Intro erwähnt. Ich hatte vor, diese Motortreiberplatine als "Huckepack" auf der RevIO-Platine zu verwenden. So erhielt ich die gleiche Platine (Radio Shack # 276-150), die zu den freiliegenden Pins meines RevIO passte. Ich habe versucht, die einfache Platine (Radio Shack # 276-149) zu verwenden, damit ich die drei Treiber der H-Bridge-Motoren parallel zur Breite der Platine platzieren konnte, aber das hat nicht funktioniert! Weil die Löcher auf der Breitseite ein Loch vor dem RevIO lagen.

Beachten Sie, dass ich die Platine so platziert habe, dass die zwei Reihen der Einzellöcher oben und die drei Reihen der Einzellöcher unten sind. So passt es zum Layout der RevIO-Karte.

Glücklicherweise konnte ich drei H-Bridge-Motortreiber-ICs auf der Mehrzweck-PC-Platine mit 417 Löchern (Radio Shack Nr. 276-150) anbringen, indem ich sie nacheinander über die positiven und negativen Schienen in der Mitte der Platine steckte.

Das andere gute war, dass es genug Platz gab, um 2x6-Stecker zu platzieren, um die Stifte der Motoren zu steuern und auf der Platine zu führen. Also platziere ich sie in der oberen linken Ecke des Boards neben der oberen 14-Pin-Schiene. Und es gab auch genug Platz, um einen 6-poligen Stecker als Alternative für das Bluetooth-Breakout-Board zu stecken. (Bluetooth-Modem - Blau SMiRF Gold (Sparkfun # WRL-10268) oder Bluetooth-Modem - Blau SMiRF Silver (Sparkfun # WRL-10269)). Also habe ich es in der unteren rechten Ecke der Platine platziert.

Schritt 4: Werkzeuge

Lötkolben und Lötarbeitsplatz

Lötmittel - Kolophoniumkern (Radio Shack # 64-013)
Anschlussdraht
Multimeter
Seitenschneider
Zange
X-acto Messer
Abisolierzange
Lötsauger
usw. (etwas anderes, das Sie vielleicht verwenden möchten.)

Schritt 5: Lässt den Spaß beginnen ...

Platziert die Komponenten auf der Platine

Die erste Komponente, die ich zu meinem Motors Controller Board hinzugefügt habe, ist der Stromanschluss (JP4).

Die zweite Komponente, die ich hinzugefügt habe, war JP2 - 2x6-Motoren und LED-Stecker von Robotic Arm Edge.

Als nächstes wurden LED1 - LED zur Anzeige der Motorstromversorgung und dann R1 - 1K Widerstand hinzugefügt.

Dann habe ich S1 - Motor Power Switch hinzugefügt.

Außerdem wurde eine 6-polige Buchse hinzugefügt, um einen Bluetooth-fähigen Anschluss herzustellen. (wahlweise)

Schritt 6: Verdrahtung der Hauptmasse

Verbinden Sie den Masse- oder Minuspol (-) der Strombuchse mit dem Schalter S1.

Schritt 7: Motortreiber

Ich habe den ersten Motortreiber-IC zur Platine hinzugefügt. Diese Motortreiber dienen zur Ansteuerung Griff (M1 - wie im Roboterarmhandbuch gezeigt) und Handgelenk (M2) des Roboterarms. Danach habe ich die Erdungspins des H-Bridge IC (Pin 4, 5, 12 und 13) angeschlossen.

Als nächstes habe ich den zweiten H-Bridge IC hinzugefügt. Diese Motortreiber dienen zur Ansteuerung Ellbogen (M3) und Schulter(M4). Und auch die Erdungspins des H-Brücken-ICs (Pin 4, 5, 12 und 13) verbunden.

Und ich habe den dritten H-Bridge IC hinzugefügt. Mit diesem Motortreiber wird nur ein letzter Motor des Roboterarms gesteuert.Base (M5). Wieder habe ich die Erdungsstifte des H-Brücken-ICs (Stift 4, 5, 12 und 13) angeschlossen.

Danach habe ich den ganzen Boden miteinander verbunden.

Schritt 8: Motorstromversorgung

Schließen Sie die Stromversorgung des Motors an Pin 8 der mittleren H-Brücken-ICs an.

Verbinden Sie Pin 16, 5-V-Pins von drei H-Brücken-ICs miteinander. Verbinden Sie dann die 5-V-Pins der H-Brücken-ICs mit dem 5-V-Pin von Arduino.

Schritt 9: Motorcontroller-Pins

Verbinden Sie die Steuerpins des Motors mit Arduino

Griff (M1)
Motor Pin Arduino Pin
9 D10
10 D9
15 D5

Motor Pin 2x6 Motors Header Connector
11 M1 unterste Reihe
14 M1 oberste Reihe
Fügen Sie 14-polige Buchsen hinzu

Handgelenk (M2)
Motor Pin Arduino Pin
1 D11
2 D8
7 D12

Motor Pin 2x6 Motors Header Connector
6 M2 oberste Reihe
3 M2 unterste Reihe

Ellbogen (M3)
Motor Pin Arduino Pin
9 D6
10 D7
15 D14 oder A0 (wie im Diagramm gezeigt)

Motor Pin 2x6 Motors Header Connector
11 M3 oberste Reihe
14 M3 unterste Reihe

Schulter (M4)
Motor Pin Arduino Pin
1 D14 oder A0 (wie auf dem Daigramm gezeigt)
2 D2
7 D4

Motor Pin 2x6 Motors Header Connector
3 M4 unterste Reihe
6 M4 oberste Reihe

Base (M5)
Motor Pin Arduino Pin
9 D3
10 D16 oder A2 (wie in der Abbildung gezeigt)
15 D17 oder A3 (wie in der Abbildung gezeigt)

Motor Pin 2x6 Motors Header Connector
11 M3 oberste Reihe
14 M3 unterste Reihe

LED Licht (L)
2x6 Motors Header-Steckverbinder Arduino Pin
L Obere Reihe D13
L Untere Reihe Gnd

Schritt 10: (Alternative) Bluetooth


Als Alternative habe ich einen Bluetooth-Anschluss hinzugefügt. Wenn Sie Bluetooth anstelle von Xbee verwenden möchten, müssen Sie das XBee-Modul entfernen. Und Sie müssen Bluetooth aus dem Sockel entfernen, wenn Sie die Skizze auf Arduino Board hochladen. Da alle diese drei das gleiche Serial Comm. Hafen.

Eine gute Sache ist, dass Arduino Sketch zwischen Bluetooth und XBee geteilt werden könnte, da beide Serial Comm verwenden.

Beachten Sie, dass dieser Bluetooth-Anschluss mit dem Sparkfun-Modem BlueSMirF GOLD oder BlueSMiRF SILVER kompatibel ist.
Weitere Informationen und ein Bluetooth-Tutorial finden Sie im Bluetooth-Tutorial von Sparkfun.

Schritt 11: Fügen Sie das Netzteil zu Arduino hinzu

Ich möchte die vorhandene Batterie-Stromversorgung erhalten, und ich möchte, dass der Arduino eine eigene Stromversorgung hat. Deshalb habe ich beschlossen, die 9-V-Batterie dem Roboter so nahe wie möglich an der Arduino-Strombuchse hinzuzufügen. Der am besten geeignete Platz befindet sich am Ende des Batteriefachs des Roboters.

Bevor ich den 9-V-Batteriehalter einbaute, entfernte ich einige der vorhandenen Teile, die Platine und die gelbe Abdeckung. Und ich brauchte den vorhandenen Handheld-Controller nicht mehr.

Ich habe zwei Löcher in das Batteriefach gebohrt, damit sie in die Löcher des 9-V-Batteriehalters passen.

Ich habe das RevIO-Gehäuse entfernt, damit ich zwei Löcher bohren konnte, die zu den vorhandenen Löchern für die gelbe Abdeckung passen. Und machte eine große runde Öffnung für die Schraube, die den Batteriedeckel des Roboters hält.

Schritt 12: Testen Sie die Motorentreiberplatine

Die folgende Skizze dient zum Testen der Motoren und der LED-Beleuchtung.

In der Skizze werden nur die Basismotoren des Roboters getestet. Um einen anderen Motor zu testen, fügen Sie die Funktionen gripUp (), gripDown () und gripPause (mSecond) hinzu, um den Robotergreifermotor usw. zu testen.

Hinweis: Entfernen Sie das XBee-Modul (oder Bluetooth, wenn Sie Bluetooth verwenden), bevor Sie die Skizze auf Arduino hochladen!

// Roboterarmmotoren und LED-Licht testen

// Grip (M1) IN und OUT Aktion
int gripEnablePin = 10;
int gripPin1 = 9;
int gripPin2 = 5;

// Handgelenk (M2) AUF und AB
int wristEnablePin = 11;
int wristPin1 = 8;
int wristPin2 = 12;

// Ellenbogen (M3) AUF und AB
int elbowEnablePin = 6;
int elbowPin1 = 7;
int elbowPin2 = 15;

// Schulter (M4) AUF und AB Aktion
int shoulderEnablePin = 14;
int shoulderPin1 = 2;
int shoulderPin2 = 4;

// Basis (M5) RECHTS und LINKS
int baseEnablePin = 3;
int basePin1 = 16;
int basePin2 = 17;

// LED EIN und AUS Aktion
int ledLight = 13;

void setup () {
pinMode (ledLight, OUTPUT);

// Griff (M1)
pinMode (gripEnablePin, OUTPUT);
pinMode (gripPin1, OUTPUT);
pinMode (gripPin2, OUTPUT);

// Handgelenk (M2)
pinMode (wristEnablePin, OUTPUT);
pinMode (wristPin1, OUTPUT);
pinMode (wristPin2, OUTPUT);

// Ellenbogen (M3)
pinMode (elbowEnablePin, OUTPUT);
pinMode (elbowPin1, OUTPUT);
pinMode (elbowPin2, OUTPUT);

// Schulter (M4)
pinMode (shoulderEnablePin, OUTPUT);
pinMode (shoulderPin1, OUTPUT);
pinMode (shoulderPin2, OUTPUT);

// base (M5)
pinMode (baseEnablePin, OUTPUT);
pinMode (basePin1, OUTPUT);
pinMode (basePin2, OUTPUT);
}

void loop () {
// Roboter-LED ein- / ausschalten
digitalWrite (ledLight, HIGH);
Verzögerung (500);
digitalWrite (ledLight, LOW);
Verzögerung (500);

// 1500 Millisekunden lang nach rechts drehen
baseRight ();
Verzögerung (1500);

// Pause für 1000 Millisekunden
basePause (1000);

// 1000 Millisekunden lang nach links drehen
baseLeft ();
Verzögerung (1000);

basePause (1000);

}

void gripIn () {
digitalWrite (gripEnablePin, HIGH);
digitalWrite (gripPin1, LOW);
digitalWrite (gripPin2, HIGH);
}

void gripOut () {
digitalWrite (gripEnablePin, HIGH);
digitalWrite (gripPin2, LOW);
digitalWrite (gripPin1, HIGH);
}

void gripPause (int mSec) {
digitalWrite (gripEnablePin, LOW);
digitalWrite (gripPin1, LOW);
digitalWrite (gripPin2, LOW);

Verzögerung (msec);
}

void wristUp () {
digitalWrite (wristEnablePin, HIGH);
digitalWrite (wristPin1, LOW);
digitalWrite (wristPin2, HIGH);
}

nichtig wristDown () {
digitalWrite (wristEnablePin, HIGH);
digitalWrite (wristPin2, LOW);
digitalWrite (wristPin1, HIGH);
}

void wristPause (int mSec) {
digitalWrite (wristEnablePin, LOW);
digitalWrite (wristPin1, LOW);
digitalWrite (wristPin2, LOW);

Verzögerung (msec);
}

void elbowUp () {
digitalWrite (elbowEnablePin, HIGH);
digitalWrite (elbowPin1, LOW);
digitalWrite (elbowPin2, HIGH);
}

void elbowDown () {
digitalWrite (elbowEnablePin, HIGH);
digitalWrite (elbowPin2, LOW);
digitalWrite (elbowPin1, HIGH);
}

void elbowPause (int mSec) {
digitalWrite (elbowEnablePin, LOW);
digitalWrite (elbowPin1, LOW);
digitalWrite (elbowPin2, LOW);

Verzögerung (msec);
}

void shoulderUp () {
digitalWrite (shoulderEnablePin, HIGH);
digitalWrite (shoulderPin1, LOW);
digitalWrite (shoulderPin2, HIGH);
}

void shoulderDown () {
digitalWrite (shoulderEnablePin, HIGH);
digitalWrite (shoulderPin2, LOW);
digitalWrite (shoulderPin1, HIGH);
}

void shoulderPause (int mSec) {
digitalWrite (shoulderEnablePin, LOW);
digitalWrite (shoulderPin1, LOW);
digitalWrite (shoulderPin2, LOW);

Verzögerung (msec);
}

void baseRight () {
digitalWrite (baseEnablePin, HIGH);
digitalWrite (basePin1, LOW);
digitalWrite (basePin2, HIGH);
}

void baseLeft () {
digitalWrite (baseEnablePin, HIGH);
digitalWrite (basePin2, LOW);
digitalWrite (basePin1, HIGH);
}

void basePause (int mSec) {
digitalWrite (baseEnablePin, LOW);
digitalWrite (basePin1, LOW);
digitalWrite (basePin2, LOW);

Verzögerung (msec);
}

Schritt 13: Konfigurieren Sie XBee und testen Sie XBee

Um den Roboterarm mit dem XBee zu steuern, benötigen wir zwei XBee-Module und ein FTDI-Kabel. Ein XBee-Modul wird ohne FTDI-Kabel mit Arduino verbunden.

Das zweite XBee-Modul wird über ein FTDI-Kabel mit einem PC oder Laptop verbunden.

Diese Anweisung ist für den Aufbau der Motorsteuerplatine vorgesehen. Es würde viel Platz und Zeit in Anspruch nehmen, die Installation, Konfiguration und den Test des XBee-Moduls zu erklären.

Hier sind meine WIKI XBee-Tutorials, in denen gezeigt wird, wie das XBee-Modul mit Hyperterminal und X-CTU konfiguriert und getestet wird:

Konfigurieren Sie XBee mit AT-Befehlen.

Konfigurieren Sie XBee mit der X-CTU-Software.

Mein XBee-Video-Tutorial.



Im Folgenden finden Sie eine Liste der Links zu den nützlichen Ressourcen, um alles über den XBee zu erfahren.

Tutorials und Informationen:

XBee Radios bei AdaFruit.

Datenblatt, Spezifikation und Konfigurations-App. von Digi

Schritt 14: Arduino Sketch & Processing Code


Im Folgenden finden Sie den Quellcode von Arduino Sketch and Processing (sowohl Arduino Sketch als auch Processing befinden sich in derselben ZIP-Datei unten):

Wenn Sie diese Skizze verwenden, stellen Sie die Baudrate Ihres XBee entsprechend Ihrer XBee-Konfiguration ein.

void setup () {
...
// ändere die Baudrate entsprechend deinem XBee, ich setze meinen XBee auf 115200.
Serial.begin (115200);
...

}


// =========== Arduino Sketch

// Sprache: Arduino
// RobotArmControl.pde
//
// von Sam Thongrong 26. Februar 2012
// rev.02
// Steuerbefehlsarray:
// {GripOut, GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
// ShoulderUp, shoulderDown, BaseCW, BaseCCW, LightOn, LightOff, Stop};
int controls [13] = {0x47, 0x67, 0x57, 0x77, 0x45, 0x65,
0x53, 0x73, 0x42, 0x62, 0x4c, 0x6c, 0x58};

// Basis
int baseEnablePin = 3;
int basePin1 = 16;
int basePin2 = 17;

// Schulter
int shoulderEnablePin = 14;
int shoulderPin1 = 2;
int shoulderPin2 = 4;

// Ellenbogen
int elbowEnablePin = 6;
int elbowPin1 = 7;
int elbowPin2 = 15;

// Handgelenk
int wristEnablePin = 11;
int wristPin1 = 8;
int wristPin2 = 12;

//Griff
int gripEnablePin = 10;
int gripPin1 = 9;
int gripPin2 = 5;

int ledPin = 13;

// setze eine Variable um das von der seriellen Schnittstelle gesendete Byte zu speichern
int incomingByte;

void setup () {
// Licht LED einstellen
pinMode (ledPin, OUTPUT);
digitalWrite (ledPin, LOW);

// setze die SN754410-Pins als Ausgänge:
pinMode (basePin1, OUTPUT);
pinMode (basePin2, OUTPUT);
pinMode (baseEnablePin, OUTPUT);

pinMode (shoulderPin1, OUTPUT);
pinMode (shoulderPin2, OUTPUT);
pinMode (shoulderEnablePin, OUTPUT);

pinMode (elbowPin1, OUTPUT);
pinMode (elbowPin2, OUTPUT);
pinMode (elbowEnablePin, OUTPUT);

pinMode (wristPin1, OUTPUT);
pinMode (wristPin2, OUTPUT);
pinMode (wristEnablePin, OUTPUT);

pinMode (gripPin1, OUTPUT);
pinMode (gripPin2, OUTPUT);
pinMode (gripEnablePin, OUTPUT);

// Daten mit einer Baudrate von 115200 senden
// Ich setze meine Xbee-Baudrate auf 115200 bps,
// ändere die Baudrate entsprechend deinem XBee
Serial.begin (115200);
}

void loop () {
// Überprüfe, ob sich etwas im seriellen Puffer befindet
if (Serial.available ()> 0) {
// Lies das Byte und speichere es in unserer Variablen
// Das gesendete Byte ist tatsächlich ein ASCII-Wert
incomingByte = Serial.read ();
// beachte die Großschreibung jedes Buchstabens!
// Jeder Buchstabe dreht einen Motor anders.

// ===== Grip
// Hineingreifen
if (incomingByte == steuert [0]) {
gripIn ();
}
// Grip Out
if (incomingByte == controls [1]) {
gripOut ();
}

//Handgelenk
if (incomingByte == controls [2]) {
// digitalWrite (wristPin1, LOW);
// digitalWrite (wristPin2, HIGH);
wristUp ();
}
if (incomingByte == controls [3]) {
wristDown ();
}

// ===== Ellenbogen
// Ellenbogen hoch
if (incomingByte == controls [4]) {
elbowUp ();
}
// Ellenbogen runter
if (incomingByte == controls [5]) {
elbowDown ();
}

// ===== Schulter
// Schulter hoch
if (incomingByte == controls [6]) {
shoulderUp ();
}
// Schulter runter
if (incomingByte == controls [7]) {
shoulderDown ();
}

// ===== Base
// Basisrecht
if (incomingByte == controls [8]) {
baseRight ();
}
// Base Left
if (incomingByte == controls [9]) {
baseLeft ();
}

// Licht an
if (incomingByte == controls [10]) {
digitalWrite (ledPin, HIGH);
}
// Licht aus
if (incomingByte == controls [11]) {
digitalWrite (ledPin, LOW);
}

// Wenn ein O gesendet wird, stellen Sie sicher, dass die Motoren ausgeschaltet sind
if (incomingByte == controls [12]) {
allStop ();
}

Verzögerung (100);
}
}

void gripIn () {
digitalWrite (gripEnablePin, HIGH);
digitalWrite (gripPin1, LOW);
digitalWrite (gripPin2, HIGH);
}

void gripOut () {
digitalWrite (gripEnablePin, HIGH);
digitalWrite (gripPin2, LOW);
digitalWrite (gripPin1, HIGH);
}

void wristUp () {
digitalWrite (wristEnablePin, HIGH);
digitalWrite (wristPin1, LOW);
digitalWrite (wristPin2, HIGH);
}

nichtig wristDown () {
digitalWrite (wristEnablePin, HIGH);
digitalWrite (wristPin2, LOW);
digitalWrite (wristPin1, HIGH);
}

void elbowUp () {
digitalWrite (elbowEnablePin, HIGH);
digitalWrite (elbowPin1, LOW);
digitalWrite (elbowPin2, HIGH);
}

void elbowDown () {
digitalWrite (elbowEnablePin, HIGH);
digitalWrite (elbowPin2, LOW);
digitalWrite (elbowPin1, HIGH);
}

void shoulderUp () {
digitalWrite (shoulderEnablePin, HIGH);
digitalWrite (shoulderPin1, LOW);
digitalWrite (shoulderPin2, HIGH);
}

void shoulderDown () {
digitalWrite (shoulderEnablePin, HIGH);
digitalWrite (shoulderPin2, LOW);
digitalWrite (shoulderPin1, HIGH);
}

void baseRight () {
digitalWrite (baseEnablePin, HIGH);
digitalWrite (basePin1, LOW);
digitalWrite (basePin2, HIGH);
}

void baseLeft () {
digitalWrite (baseEnablePin, HIGH);
digitalWrite (basePin2, LOW);
digitalWrite (basePin1, HIGH);
}

void allStop () {
digitalWrite (baseEnablePin, LOW);
digitalWrite (basePin1, LOW);
digitalWrite (basePin2, LOW);

digitalWrite (shoulderEnablePin, LOW);
digitalWrite (shoulderPin1, LOW);
digitalWrite (shoulderPin2, LOW);

digitalWrite (elbowEnablePin, LOW);
digitalWrite (elbowPin1, LOW);
digitalWrite (elbowPin2, LOW);

digitalWrite (wristEnablePin, LOW);
digitalWrite (wristPin1, LOW);
digitalWrite (wristPin2, LOW);

digitalWrite (gripEnablePin, LOW);
digitalWrite (gripPin1, LOW);
digitalWrite (gripPin2, LOW);
}

// =========== Arduino End



Es folgt der Processing Source Code. Sie benötigen die Hintergrundbilddatei und alle Schaltflächenbilddateien, um diese Schaltflächen auf dem Bildschirm anzuzeigen.

Alle Hintergrundinformationen und Schaltflächen werden bereitgestellt und befinden sich in dem Ordner mit dem Namen data. Dieser Ordner muss sich im selben Ordner wie der Verarbeitungscode (RobotArmControl.pde) befinden.

// Sprache: Verarbeitung
// RobotArmControl.pde

// von Sam Thongrong 26. Februar 2012

// Laden Sie die serielle Bibliothek für die Verarbeitung
Import Processing.Serial. *;
// Instanz der seriellen Klasse
Serielle Schnittstelle;

// Steuerbefehlsarray:
// GripOut, GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
// ShoulderUp, ShoulderDown, BaseCW, BaseCCW, LightOn, LightOff, Stop

int [] controls = new int [] {
0x47, 0x67, 0x57, 0x77, 0x45, 0x65,
0x53, 0x73, 0x42, 0x62, 0x4c, 0x6c, 0x58};

// Bildschaltfläche.
// Bilder laden und zum Erstellen einer Schaltfläche verwenden.
ImageButtons GripIn;
ImageButtons GripOut;
ImageButtons WristUp;
ImageButtons WristDown;
ImageButtons ElbowUp;
ImageButtons ElbowDown;
ImageButtons ShoulderUp;
ImageButtons ShoulderDown;
ImageButtons BaseCW;
ImageButtons BaseCCW;
ImageButtons LightOn;
ImageButtons LightOff;

ImageButtons Pause;

// Hintergrund
PImage bg;

// setze die Schriftart
PFont myFont;

void controlGUI ()
{
bg = loadImage ("background.jpg");
Hintergrund (bg);

int buttonSize = 44;

PImage selected = loadImage ("controlSel.png");

// Hineingreifen
PImage gripInImage = loadImage ("controlIn.png");
PImage gripInOver = loadImage ("controlInOver.png");
GripIn = neue ImageButtons (30, 83, buttonSize, buttonSize,
gripInImage, gripInOver, selected);

// Grip Out
PImage gripOutImage = loadImage ("controlOut.png");
PImage gripOutOver = loadImage ("controlOutOver.png");
GripOut = neue ImageButtons (78, 83, buttonSize, buttonSize,
gripOutImage, gripOutOver, selected);

// Handgelenk hoch
PImage wristUpImage = loadImage ("controlUp.png");
PImage wristUpOver = loadImage ("controlUpOver.png");
WristUp = neue ImageButtons (150, 36, buttonSize, buttonSize,
wristUpImage, wristUpOver, selected);

// Handgelenk runter
PImage wristDownImage = loadImage ("controlDown.png");
PImage wristDownOver = loadImage ("controlDownOver.png");
WristDown = neue ImageButtons (198, 36, buttonSize, buttonSize,
wristDownImage, wristDownOver, selected);

// Ellenbogen hoch
PImage elbowUpImage = loadImage ("controlUp.png");
PImage elbowUpOver = loadImage ("controlUpOver.png");
ElbowUp = neue ImageButtons (258, 83, buttonSize, buttonSize,
elbowUpImage, elbowUpOver, selected);

// Ellenbogen runter
PImage elbowDownImage = loadImage ("controlDown.png");
PImage elbowDownOver = loadImage ("controlDownOver.png");
ElbowDown = neue ImageButtons (306, 83, buttonSize, buttonSize,
elbowDownImage, elbowDownOver, selected);

// Schulter hoch
PImage shoulderUpImage = loadImage ("controlUp.png");
PImage shoulderUpOver = loadImage ("controlUpOver.png");
ShoulderUp = neue ImageButtons (208, 160, buttonSize, buttonSize,
shoulderUpImage, shoulderUpOver, selected);

// Schulter runter
PImage shoulderDownImage = loadImage ("controlDown.png");
PImage shoulderDownOver = loadImage ("controlDownOver.png");
ShoulderDown = neue ImageButtons (256, 160, buttonSize, buttonSize,
shoulderDownImage, shoulderDownOver, selected);

// Base CW
PImage baseCWImage = loadImage ("controlCW.png");
PImage baseCWOver = loadImage ("controlCWOver.png");
BaseCW = neue ImageButtons (130, 234, buttonSize, buttonSize,
baseCWImage, baseCWOver, selected);

// Base CCW
PImage baseCCWImage = loadImage ("controlCCW.png");
PImage baseCCWOver = loadImage ("controlCCWOver.png");
BaseCCW = neue ImageButtons (178, 234, buttonSize, buttonSize,
baseCCWImage, baseCCWOver, selected);
//Licht an
PImage lightOnImage = loadImage ("LightOn.png");
PImage lightOnOver = loadImage ("LightOnOver.png");
LightOn = neue ImageButtons (30, 184, buttonSize, buttonSize,
lightOnImage, lightOnOver, selected);

//Licht aus
PImage lightOffImage = loadImage ("LightOff.png");
PImage lightOffOver = loadImage ("LightOffOver.png");
LightOff = neue ImageButtons (78, 184, buttonSize, buttonSize,
lightOffImage, lightOffOver, selected);

}

void setup () {
// Alle verfügbaren seriellen Ports im Ausgabebereich auflisten.
// Sie müssen den Port auswählen, der das Arduino-Board ist
// verbunden mit von dieser Liste. Der erste Port in der Liste ist
// Port # 0 und der dritte Port in der Liste ist Port # 2.
// println (Serial.list ());
// Öffnen Sie den Port, an den die Arduino-Karte angeschlossen ist
// (in diesem Fall # 0)
// Stellen Sie sicher, dass der Port mit der gleichen Geschwindigkeit geöffnet wird, mit der Arduino arbeitet
// using (112500bps)
// port = new Serial (this, Serial.list () [1], 112500);

// Verwenden Sie auf einem Windows-PC "Ausgehend" vom Bluetooth-Gerät
// Dieser für XBee
port = new Serial (dies "COM30", 115200);

// Bildschirmgröße des Programms
// size (145, 455);
Größe (400, 300);
glatt();

// Ellipse testen
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 ();
}

// Befehle senden
void sendCommands () {

// Griff
if (GripIn.pressed) {
port.write (steuert [0]);
// println ("Grip In:" + (char) controls [0]);
}
if (GripOut.pressed) {
port.write (Steuerelemente [1]);
// println ("Grip Out:" + (char) controls [1]);
}
if (mouseX> 30 && mouseX <129 &&
mouseY> 51 && mouseY <79) {
port.write (Steuerelemente [12]);
// println ("Grip Stop!" + (char) Steuerelemente [12]);
}

// Handgelenk
if (WristUp.pressed) {
port.write (Steuerelemente [2]);
// println ("Wrist Up:" + (char) -Kontrollen [2]);
}
if (WristDown.pressed) {
port.write (Steuerelemente [3]);
// println ("Wrist Down:" + (char) -Kontrollen [3]);
}
if (mouseX> 148 && mouseX <248 &&
mouseY> 5 && mouseY <33) {
port.write (Steuerelemente [12]);
// println ("Wrist Stop!" + (char) -Kontrollen [12]);
}

// Ellenbogen
if (ElbowUp.pressed) {
port.write (Steuerelemente [4]);
// println ("Elbow Up:" + (char) -Kontrollen [4]);
}
if (ElbowDown.pressed) {
port.write (Steuerelemente [5]);
// println ("Elbow Down:" + (char) -Kontrollen [5]);
}
if (mouseX> 258 && mouseX <358 &&
mouseY> 51 && mouseY <79) {
port.write (Steuerelemente [12]);
// println ("Elbow Stop!" + (char) -Kontrollen [12]);
}

//Schulter
if (ShoulderUp.pressed) {
port.write (Steuerelemente [6]);
// println ("Shoulder Up:" + (char) -Kontrollen [6]);
}  
if (ShoulderDown.pressed) {
port.write (Steuerelemente [7]);
// println ("Shoulder Down:" + (char) -Kontrollen [7]);
}
if (mouseX> 208 && mouseX <308 &&
mouseY> 130 && mouseY <158) {
port.write (Steuerelemente [12]);
// println ("Shoulder Stop!" + (char) -Kontrollen [12]);
}

// Basis
if (BaseCW.pressed) {
port.write (Steuerelemente [8]);
// println ("Base Rotate CW:" + (char) Steuerelemente [8]);
}
if (BaseCCW.pressed) {
port.write (Steuerelemente [9]);
// println ("Base Rotate CCW:" + (char) Steuerelemente [9]);
}
if (mouseX> 130 && mouseX <230 &&
mouseY> 202 && mouseY <230) {
port.write (Steuerelemente [12]);
// println ("Base Stop!" + (char) Steuerelemente [12]);
}

// Licht
if (LightOn.pressed) {
port.write (Steuerelemente [10]);
// println ("Light On:" + (char) Steuerelemente [10]);
}
if (LightOff.pressed) {
port.write (Steuerelemente [11]);
// println ("Light Off:" + (char) -Kontrollen [11]);
}
}

Unentschieden ()
{
updateDisplay ();

sendCommands ();
}

// Button & ImageButtons Klassen
Klasse Button
{
int x, y;
int w, h;
Grundfarbe, Highlightfarbe;
Farbe aktuelleFarbe;
boolean over = false;
Boolescher Wert gedrückt = falsch;

nichtig gedrückt () {
if (über && mousePressed) {
gedrückt = wahr;
} else {
gedrückt = falsch;
}   
}

Boolesches overRect (int x, int y, int width, int height) {
if (mouseX> = x && mouseX <= x + width &&
mouseY> = y && mouseY <= y + height) {
return true;
} else {
falsch zurückgeben;
}
}
}

Klasse ImageButtons erweitert Button
{
PImage base;
PImage roll;
PImage down;
PImage currentimage;

ImageButtons (int ix, int iy, int iw, int ih,
PImage ibase, PImage iroll, PImage idown)
{
x = ix;
y = iy;
w = iw;
h = ih;
base = ibase;
roll = iroll;
down = idown;
aktuelles Bild = Basis;
}

Update stornieren ()
{
Über();
gedrückt ();
wenn (gedrückt) {
aktuelles Bild = unten;
} sonst wenn (vorbei) {
aktuelles Bild = Rolle;
} else {
aktuelles Bild = Basis;
}
}

nichtig über ()
{
if (overRect (x, y, w, h)) {
über = wahr;
} else {
over = false;
}
}

Ungültige Anzeige ()
{
image (aktuelles Bild, x, y);
}
}

// Bearbeitungsende

Bewegen Sie den Cursor zur Steuerung des Roboterarmmotors auf die gewünschte Schaltfläche und klicken Sie.
Um den Betrieb zu stoppen, bewegen Sie den Cursor einfach auf ein Etikett. Der Roboter stoppt.
Um mehrere Motoren gleichzeitig zu betreiben, bewegen Sie den Cursor auf die gewünschten Schaltflächen und klicken Sie auf diese Schaltflächen.
Ziehen Sie den Cursor jedoch nicht über die Beschriftungen, da sonst der Vorgang angehalten wird

Genießen!.

Schritt 15: Video

Hier ist das Video.