Go Down

Topic: Controlling Multiple Servos Through Serial (Read 1 time) previous topic - next topic

XxAmericanEaglexX

Hey Everybody

I'm a bit of a Arduino coding noob as I have just recently received my Arduino, but I have this great idea for a Nerf Sentry gun that I will be able to control from my computer in my room. I have my interface completed in VB 2008, except for a value that I can send through the serial port to the Arduino to tell the servos what to do. I'm thinking along the lines of:

(Visual Basic Code)
serialport1.write (Yup) 'When the Arduino receives, it will move the Y servo up an increment of 10.'
serialport1.write (Ydown) 'When the Arduino receives, it will move the Y servo down an increment of 10.'
serialport1.write (Xup) 'When the Arduino receives, it will move the X servo up an increment of 10.'
serialport1.write (Xdown) 'When the Arduino receives, it will move the X servo down an increment of 10.'

If anybody is curios of what I have for the VB code done so far, here it is.
Code: [Select]

Public Class Form1
   Const WM_CAP As Short = &H400S
   Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
   Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
   Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
   Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
   Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
   Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
   Const WS_CHILD As Integer = &H40000000
   Const WS_VISIBLE As Integer = &H10000000
   Const SWP_NOMOVE As Short = &H2S
   Const SWP_NOSIZE As Short = 1
   Const SWP_NOZORDER As Short = &H4S
   Const HWND_BOTTOM As Short = 1
   Dim iDevice As Integer = 0
   Dim hHwnd As Integer
   Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
   Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
   Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
   Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer
   Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean

   Private Sub LoadDeviceList()
       Dim strName As String = Space(100)
       Dim strVer As String = Space(100)
       Dim bReturn As Boolean
       Dim x As Integer = 0
       Do
           bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
           If bReturn Then lstDevices.Items.Add(strName.Trim)
           x += 1
       Loop Until bReturn = False
   End Sub

   Private Sub OpenPreviewWindow()
       Dim iHeight As Integer = picCapture.Height
       Dim iWidth As Integer = picCapture.Width
       hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCapture.Handle.ToInt32, 0)
       If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
           SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
           SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
           SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
           SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, SWP_NOMOVE Or SWP_NOZORDER)
           btnStop.Enabled = True
           btnStart.Enabled = False
       Else
           DestroyWindow(hHwnd)
       End If
   End Sub
   Private Sub ClosePreviewWindow()
       SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
       DestroyWindow(hHwnd)
   End Sub

   Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
       If e.KeyCode = Keys.S Then
           TurretDown()
       End If
       If e.KeyCode = Keys.W Then
           TurretUp()
       End If
       If e.KeyCode = Keys.D Then
           TurretRight()
       End If
       If e.KeyCode = Keys.A Then
           TurretLeft()
       End If
       If e.KeyCode = Keys.NumPad5 Then
           TurretFire()
       End If
       If e.KeyCode = Keys.NumPad7 Then
           Booster()
       End If
       If e.KeyCode = Keys.NumPad9 Then
           Laser()
       End If
   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       LoadDeviceList()
   End Sub

   Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
       OpenPreviewWindow()
       btnStart.Enabled = False
       btnStop.Enabled = True
       btnStart.Visible = False
       btnStop.Visible = True
   End Sub

   Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
       ClosePreviewWindow()
       btnStart.Enabled = True
       btnStop.Enabled = False
       btnStart.Visible = True
       btnStop.Visible = False
   End Sub

   Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
       My.Computer.Audio.Play(My.Resources.teleporter_receive, AudioPlayMode.Background)
   End Sub

   Private Sub Button13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click
       My.Computer.Audio.Play(My.Resources.teleporter_send, AudioPlayMode.Background)
   End Sub

   Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click
       My.Computer.Audio.Play(My.Resources.sentry_spot_client, AudioPlayMode.Background)
   End Sub

   Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
       TurretFire()
   End Sub

   Private Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
       My.Computer.Audio.Play(My.Resources.teleporter_explode, AudioPlayMode.Background)
   End Sub

   Private Sub Button15_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button15.Click
       My.Computer.Audio.Play(My.Resources.sapper_plant, AudioPlayMode.Background)
   End Sub

   Private Sub Button17_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button17.Click
       My.Computer.Audio.Play(My.Resources.sentry_scan_use_, AudioPlayMode.BackgroundLoop)
   End Sub

   Private Sub Button18_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button18.Click
       My.Computer.Audio.Play(My.Resources.sentry_damage2, AudioPlayMode.Background)
   End Sub

   Private Sub Button19_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button19.Click
       My.Computer.Audio.Play(My.Resources.sentry_damage4, AudioPlayMode.Background)
   End Sub

   Private Sub TurretUp()
       MsgBox("Up")
   End Sub
   Private Sub TurretDown()
       MsgBox("Down")
   End Sub
   Private Sub TurretFire()
       My.Computer.Audio.Play(My.Resources.dispenser_generate_metal, AudioPlayMode.Background)
       MsgBox("Fire")
   End Sub
   Private Sub TurretRight()
       MsgBox("Right")
   End Sub
   Private Sub TurretLeft()
       MsgBox("Left")
   End Sub
   Private Sub Laser()
       MsgBox("Laser")
   End Sub
   Private Sub Booster()
       MsgBox("Booster")
   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       TurretUp()
   End Sub

   Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
       TurretDown()
   End Sub

   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
       TurretRight()
   End Sub

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       TurretLeft()
   End Sub
End Class


(The majority of the code is for the webcam interface)

I already have the code done for the relays that will turn the laser pointer and the booster's that will shoot the Nerf bullets out, all I need is the code for the 3 servos that will control the X movement, Y movement, and that will pull the trigger. Any sample code or anything would be AWESOME.

Any help will be greatly appreciated :). Oh, and if your going to tell me to look up 'Multi Servo Serial Control or something like that, trust me.. I have.. None are of any use to me ;)

mspguy

Your topic is a bit confusing, which is why you may get less readers.  Try and title things from the point of view of the Arduino.  

In any case, there is a servo library with documentation here: http://arduino.cc/en/Reference/Servo

Servos are pretty popular so you should be able to find lots of examples too.

billroy

Have a look at this blog post describing how to use Bitlash to run multiple servos; it may be helpful:

http://entropymouse.com/blog/blog:bitlash_1.1_and_servo_mayhem

Bitlash is an interpreter and command shell that runs on the Arduino.  You can find out more at http://bitlash.net

Hope that helps,

-br
http://bitlash.net
http://entropymouse.com

PaulS

Quote
I have.. None are of any use to me

This topic only comes up about once a week. If none of the solutions posted are of any use to you, you're pretty much on your own.

There are really only so many ways to tell to servos to move. Individually (<1:120> to move servo one to position 120, for instance), or in pairs, where a value for each servo is supplied every time (<120, 15>), and with the values as bytes or as strings.

Since none of these will work for you, I guess you'll need to come up with your own method.

zoomkat

Quote
all I need is the code for the 3 servos that will control the X movement, Y movement, and that will pull the trigger. Any sample code or anything would be AWESOME.


VB code or arduino code?
Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

XxAmericanEaglexX

Quote
VB code or arduino code?


Arduino code.

XxAmericanEaglexX

Instead of the whole:

Code: [Select]

serialport1.write (Yup) 'When the Arduino receives, it will move the Y servo up an increment of 10.'


Would it be possible to have a code that would subtract the initial digit (in this case, 5, 6, or 7) and just use that value that follows it? This is the code that I have so far. (Arduino)

Code: [Select]

#include <Servo.h>

Servo myservo1;
Servo myservo2;
Servo myservo3;

char val;
int Relay = 8;

void setup()
{
 pinMode(Relay = 8, OUTPUT);
 pinMode(ledpin = 9, OUTPUT);
 myservo1.attach(10);
 myservo2.attach(11);
 myservo3.attach(12);
 
    Serial.begin(9600);
   
}

void loop() {
 if( Serial.available() )
 
   {;}
   
 val = Serial.read();

 if( val == '1' )

 {
   digitalWrite(Relay = 8, HIGH);
   
 }
 if( val == '2' )
 {
   digitalWrite(Relay = 8, LOW);
   
 }
  if( val == '3' )
 {
   digitalWrite(ledpin = 9, HIGH);
   
 }
 if( val == '4' )
 {
   digitalWrite(ledpin = 9, LOW);
 }
 if( val == '5 - "(Position between 0 and 180)"' ) //Servo 1
 {
 //Code? (Remove the "6 - " and just use the value)
 }
 if( val == '6 - "(Position between 0 and 180)"' ) //Servo 2
 {
 //Code? (Remove the "6 - " and just use the value)  
 }
 if( val == '7 - "(Position between 0 and 180)"' ) //Servo 3
 {
  //Code? (Remove the "6 - " and just use the value)  
 }
}


zoomkat

Test code for two servos, which can be expanded to more if desired.

Code: [Select]

// zoomkat 11-22-10 serial servo (2) test
// for writeMicroseconds, use a value like 1500
// for IDE 0019 and later
// Powering a servo from the arduino usually DOES NOT WORK.
// two servo setup with two servo commands
// send eight character string like 15001500 or 14501550

#include <Servo.h>
String readString, servo1, servo2;
Servo myservo1;  // create servo object to control a servo
Servo myservo2;

void setup() {
 Serial.begin(9600);
 myservo1.attach(6);  //the pin for the servo control
 myservo2.attach(7);
 Serial.println("servo-test-21"); // so I can keep track of what is loaded
}

void loop() {

 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     readString += c; //makes the string readString
   }
 }

 if (readString.length() >0) {
     Serial.println(readString); //see what was received
     
     // expect a string like 07002100 containing the two servo positions      
     servo1 = readString.substring(0, 4); //get the first four characters
     servo2 = readString.substring(4, 8); //get the next four characters
     
     Serial.println(servo1);  //print ot serial monitor to see results
     Serial.println(servo2);
     
     int n1; //declare as number  
     int n2;
     
     char carray1[6]; //magic needed to convert string to a number
     servo1.toCharArray(carray1, sizeof(carray1));
     n1 = atoi(carray1);
     
     char carray2[6];
     servo2.toCharArray(carray2, sizeof(carray2));
     n2 = atoi(carray2);
     
     myservo1.writeMicroseconds(n1); //set servo position
     myservo2.writeMicroseconds(n2);
   readString="";
 }
}
Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

Go Up