İlk Arduino Robotum

 

Gamepad kontrollü 3 tekerlekli Internet Robot

 

Bu benim ilk robotum. Bence Arduinoya başlangıç için güzel bir proje oldu. Projeye ilk başladığımda robotun iki teker üzerinde gitmesini istiyordum, ama elimdeki motorlarla bunu yapamayacağımı anlayınca revizyona giderek üç tekerlekli olarak  yapmaya karar verdim.

 

Kullandığım malzemeler:

  • Arduino Uno

  • Arduino Ethernet Shield

  • Dual H Bridge Motor Controller 

  • TP-Link TL-WR702N Wireless Modül.

  • 100 rpm 2 motor.

  • 12 Volt akü (2 adet 6 volt)

  • Birkaç adet DC to DC Voltaj regülatörleri

  • IP Camera

  • Gamepad

  • Tekerlek, kutu vs

Robotun Maliyeti 350 TL civarında tuttu. Pahalı tabi, ama sonuçta kullandığınız malzemelerin bir çoğunu söküp başka bir projede kullanabiliyorsunuz.

Yani malzeme ziyan olmuyor.

 

 

 

 

 

 

 

 

 

Robotun Kontrolü

 

Robota komutları önce PC den serial port üzerinden APC220 RF modül yardımıyla gönderiyordum. Daha sonra onu internet üzerinden kontrol etmek istedim. TP-Link TL-WR702N Wireless Modül aldım. Gerçekten çok şahane oldu. Modeminiz wireless ise kolaylıkla bağlantı kuruyorsunuz. (Kablosuz ayarlarını bir arkadaşım (Sertaç Akyüz) yaptı. Sonsuz teşekkür. Onun yardımı olmadan bu robot çalışmazdı doğrusu.) Robotun üzerindeki IP kamera robottan bağımsız olarak direk modem üzerinden çalışıyor.

 

 

 

  Sertaç (sağda) ve Ben

 

PC ye bağladığım bir gamepad üzerinden robotu yönlendiriyorum.  Bunun için C# kullanarak bir arayüz hazırladım.  

Gamepad için gerekli kodları Umut Erkal'ın web sitesinde buldum. Tek kelimeyle SÜPER kodlar. Linki aşağıda:

 

http://www.uerkal.com/posts/csharpusbgamepaddirectx.aspx

 

C# den veriler UDP protokolü kullanılarak gönderiliyor. Kaynak kodlar buradan alınma.

 

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/92846ccb-fad3-469a-baf7-bb153ce2d82b

 

Kullandığım Arduino kodları ise aşağıda veriyorum. Kusura bakmayın, kodlar biraz kirli. 

 

 

#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> 


String data[]={
"","","","","","",""};
String inputString = "";

int horn=15;
int lamp=14;
int alarm=0;
String c1,c2,c3,c4;


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 2, 165);

unsigned int localPort = 8888; // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
inputString.reserve(200);
//---( THEN set pins as outputs )----
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);

pinMode(horn, OUTPUT);
pinMode(lamp, OUTPUT);

//-------( Initialize Pins so relays are inactive at reset)----
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);

delay(1000);

// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);

Serial.begin(9600);
}

void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if(packetSize)
{
IPAddress remote = Udp.remoteIP();
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);

//Serial.println(packetBuffer);
String datam=packetBuffer;

int i=0;
while (i<packetSize) {
char inChar = datam[i];
if (inChar == '&') {
int myLength=inputString.length();
int anchor=0;
int counter=0;
;
for(int i=0;i<myLength;i++){
if(inputString[i]==','){
data[counter]=inputString.substring(anchor,i);
anchor=i+1;
counter++;
}
}
int dcValue1=data[1].toInt();
int dcValue2=data[2].toInt();
c1=data[3].substring(0, 1);
c2=data[3].substring(1, 2); 
c3=data[3].substring(2, 3); 
c4=data[3].substring(3, 4); 


if(c2=="0"){
if(c1=="1"){
digitalWrite(horn,HIGH); 
}
else{
digitalWrite(horn,LOW); 
}
}

if(c4=="0"){
if(c3=="1"){
digitalWrite(lamp,HIGH); 
}
else{
digitalWrite(lamp,LOW); 
}
}


if(dcValue1 >=0){
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
else{
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if(dcValue2 >=0){
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
else{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}

analogWrite(5, abs(dcValue1));
analogWrite(6, abs(dcValue2));
Serial.print(dcValue1);
Serial.print(",");
Serial.print(dcValue2);
inputString = "";
}
else{
inputString += inChar;
}
i++;
}

// send a reply, to the IP address and port that sent us the packet we received
//Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
//Udp.write(ReplyBuffer);
//Udp.endPacket();
}
delay(15);


if(c2=="1"){
if(alarm<10){
digitalWrite(lamp,HIGH);
digitalWrite(horn,HIGH);
}
else{
digitalWrite(lamp,LOW);
digitalWrite(horn,LOW);
}
}
alarm++;
if(alarm==100){
alarm=0; 
}

}

void split(){



}

 

 

 

Buradan robotun videosunu izleyebilirsiniz. 

 

 

 

Okuduğunuz için teşekkürler.

Sağlıcakla kalın.

 

Han Erim

 

 

 

 

 

Relativite Teorisini öğrenmek istiyorsanız aliceinphysics.com websitemi ziyaret edebilirsiniz.