Roboter Bioloid mit Pixy Cam und DF Robot Servo Shield

Hallo zusammen

Ich plane meinen Bioloid Roboter mit einer Pixy Cam auszustatten.

damit ich die AX-12A Servos ansteuern kann mit einem Arduino Mega benutze ich noch, von DF Robot das Digital Servo driver Shield V1.0 , dieses servo Shield benutzt aber die 6 Pins in der Mitte das Arduino , wo eigendlich die Pixy cam eingesteckt wird .

Zu meiner Frage kann ich die Pixy alternativ wo anders anklemmen ?

oder kann ich die Pixy trotzdem an den belegten mittleren 6Pins anschließen durch einen umbau/abzweig?

und hat schon wer diesen Aufbau selbst versucht?

bin für alle Hilfen und Ratschläge offen.

vielleicht noch zur Info bin absoluter Neuling was Programieren und Elektronik angeht.

Das ist die SPI Schnittstelle. Das ist ein Bus der von mehreren Geräten gleichzeitig verwendet werden kann. Jedes Gerät braucht dann einen eigenen Chip Select/Slave Select Pin.

Auf dem Mega ist die auch auf Pins 50-53: http://arduino.cc/en/Reference/SPI (etwas runter zu "connections")

danke erst mal für die schnelle Antwort.

um das richtig zu verstehen ,

ich kann alle Pins ( durchschleifen bis auf den Slave und der kommt dann in 53)

Was willst Du mit einer Pixy Cam am Arduino?

ich kann alle Pins ( durchschleifen bis auf den Slave und der kommt dann in 53)

Nein, Alle, außer SS. Jedes Gerät braucht sein SS_Signal.

Grüße Uwe

Warum die Pixy am Arduino?

weil ich denke das die Cam mit dem Robotis CM-530 Controler nicht kompatibel ist zumindest mit der RoboPlus Software , und da ich Anfänger bin und es für Arduino viel mehr Lehrmaterial gibt hab ich mich für diesen weg entschieden . Was die Servo Programierung angeht komme ich mit dem DF- Shield gut zurecht.

Ziel soll es sein Gegenstände zu erkennen und darauf reagieren zu können , da bin ich mit meinen Ultraschall Sensoren zur zeit sehr eingeschränkt

Nein; Arduino (außer dem TRE der noch nicht verkauft wird) ist ungeeignet um Bildverarbeitung bzw Bildanalyse zu machen. Du brauchst sowas wie einen Rasberry. Güße Uwe

Mit Pixy meine ich diese hier

http://macherzin.net/article107-Pixy-CMUcam5-Pixy-Kamera-Modul

Die ist doch kompatibel ?

Du verunsicherst mich gerade ein wenig

Hier mal ein Foto von meinem Projekt
Ist noch nicht fertig re Arm fehlt noch teilweise und der Kopf ( und der Anstrich)
Alles was weiß ist würde selbst gedruckt mit CAD programm und UP mini

uwefed: Nein; Arduino (außer dem TRE der noch nicht verkauft wird) ist ungeeignet um Bildverarbeitung bzw Bildanalyse zu machen. Du brauchst sowas wie einen Rasberry.

Es gibt Kameras die das selbst erledigen und denen man nur Steuerbefehle schicken muss

Ich hab ein weiteres Problem, es geht um die Servo ansteuerung Dynamixel AX-12A.

Aufbau:

Arduino Mega 2560 , DF Robot Digital Servo driver Shield V1 (DRI0027)

Problem:

ich kann die Servos mit ID separat ansprechen und mit rotate bewegen auch kann ich die Geschwindigkeit ändern .

Aber er hällt beim write Befehl nicht auf der eingestellten Gradzahl an sondern dreht einfach weiter.

der befehl dazu nent sich : myservo.write(8,200); // ID=8 , Grad 200

Ich habe einiges nachgelesen und festgestellt das das Shield für den Uno gedacht ist

und da die Servos über die SPI angesprochen werden denke ich das die Pinbelegung daran schuld ist.

ich hab auch versucht den SS pin an 53 anzuschließen und habe in der header datei von 10 auf 53

umgestellt, aber dann lässt sich der Servo nicht mehr ansprechen.

ich hoffe jemand hat eine Idee.

hier erst mal die Beispieldatei:

/*

This Sample code is for testing the Digital Servo Shield.

Editor : YouYou

Date : 2014.10.24

Ver : 1.0

Product: Digital Servo Shield for Arduino

SKU :

Hardwares:

  1. Arduino UNO
  2. Digital Servo Shield for Arduino
  3. Digital Servos( Compatible with AX-12,CDS55xx…etc)
  4. Power supply:6.5 - 12V

*/

#include <SPI.h>
#include <ServoCds55.h>
ServoCds55 myservo;

void setup (void)
{
Serial.begin (115200);
myservo.begin ();
}

void loop (void)
{

if(Serial.available()){
char val = Serial.read();
if(val != -1)
{
switch(val)
{
case ‘p’:
myservo.write(1,300);//ID:1 Pos:300 velocity:150
delay(3000);
myservo.write(1,0);//ID:1 Pos:0 velocity:150
break;

case ‘v’:
myservo.setVelocity(100);// set velocity to 100(range:0-300) in Servo mode
break;

case ‘m’:
myservo.rotate(1,150);// CCW ID:1 Velocity: 150 middle velocity 300 max
delay(2000);
myservo.rotate(1,-150);// CW ID:1 Velocity: -150 middle velocity -300 max
break;

// case ‘i’:
// myservo.SetID(1,2);//ID:1 newID:2
// break;
//
// case ‘r’:
// myservo.Reset(2);//Restore ID2 servo to factory Settings ( ID:1 Baud rate:1000000)
// break;

}
}
else
Serial.println(“Wait”);
delay(500);

}

}

und hier ist noch die header Datei

/*
ServoCds55.h - Library for Digital Servo Driver Shield
OCT 24th, 2014
Version 1.0
*/

#ifndef __ServoCds55_H
#define __ServoCds55_H

#if ARDUINO >= 100
#include “Arduino.h”
#else
#include “WProgram.h”
#endif

#include <SPI.h>

class ServoCds55
{
public:
ServoCds55(int CS=53);
void begin();
void WritePos(int ID,int Pos);
void write(int ID,int Pos);
void setVelocity(int velocity);
void setPoslimit(int posLimit);
void rotate(int ID,int velocity);
void SetServoLimit(int ID,int upperLimit);
void SetMotormode(int ID, int velocity);
void SetID(int ID, int newID);
void Reset(int ID);
byte transferAndWait (const byte what);

private:
int velocity_temp;
int upperLimit_temp;
int cs;
};

#endif

Hier noch die c++ datei die da auch hinterlegt ist

/* ServoCds55.cpp - Library for Digital Servo Driver Shield OCT 24th, 2014 Version 1.0 */

include "ServoCds55.h"

ServoCds55::ServoCds55 (int CS):cs(CS) { velocity_temp = 150; upperLimit_temp = 300; }

void ServoCds55::begin() { pinMode(cs,OUTPUT); digitalWrite(cs,HIGH); SPI.begin (); SPI.setClockDivider(SPI_CLOCK_DIV8); }

byte ServoCds55::transferAndWait (const byte what) { byte a = SPI.transfer (what); delayMicroseconds (20); return a; }

void ServoCds55::setVelocity(int velocity){ //set servo velocity velocity_temp = velocity; }

void ServoCds55::setPoslimit(int posLimit){ // set servo pos limit upperLimit_temp = posLimit; }

void ServoCds55::write(int ID,int Pos){ // Servo Mode SetServoLimit(ID,upperLimit_temp); WritePos(ID,Pos);// default velocity:150 }

void ServoCds55::rotate(int ID,int velocity){ // Motor Mode SetServoLimit(ID,0); delay(100); SetMotormode(ID,velocity); }

void ServoCds55::WritePos(int ID,int Pos){

int PosB = (Pos>>8 & 0xff);//low int PosS = (Pos & 0xff);//high int velocityB = (velocity_temp>>8 & 0xff); int velocityS = (velocity_temp & 0xff); digitalWrite(cs, LOW); transferAndWait ('p'); transferAndWait (ID); transferAndWait (PosB); transferAndWait (PosS); transferAndWait (velocityB); transferAndWait (velocityS); transferAndWait ('\t'); transferAndWait ('\r'); transferAndWait ('\n'); digitalWrite(cs, HIGH); delay(10); }

void ServoCds55::SetServoLimit(int ID,int upperLimit_temp){

int upperLimitB = (upperLimit_temp>>8 & 0xff); int upperLimitS = (upperLimit_temp & 0xff); digitalWrite(cs, LOW); transferAndWait ('s'); transferAndWait (ID); transferAndWait (upperLimitB); transferAndWait (upperLimitS); transferAndWait ('\t'); transferAndWait ('\r'); transferAndWait ('\n'); digitalWrite(cs, HIGH); delay(10); }

void ServoCds55::SetMotormode(int ID, int velocity){

int velocityB = (velocity>>8 & 0xff); int velocityS = (velocity & 0xff); digitalWrite(cs, LOW); transferAndWait ('m'); transferAndWait (ID); transferAndWait (velocityB); transferAndWait (velocityS); transferAndWait ('\t'); transferAndWait ('\r'); transferAndWait ('\n'); digitalWrite(cs, HIGH); delay(10); }

void ServoCds55::SetID(int ID, int newID){

digitalWrite(cs, LOW); transferAndWait ('i'); transferAndWait (ID); transferAndWait (newID); transferAndWait ('\t'); transferAndWait ('\r'); transferAndWait ('\n'); digitalWrite(cs, HIGH); delay(10); }

void ServoCds55::Reset(int ID){

digitalWrite(cs, LOW); transferAndWait ('r'); transferAndWait (ID); transferAndWait ('\t'); transferAndWait ('\r'); transferAndWait ('\n'); digitalWrite(cs, HIGH); delay(10); }

Hallo

Ich möcht hier noch vermerken das ich das Problem gefunden habe.

für alle die auch dieses Problem haben sollten.

Das Servo Shield funkioniert auch mit dem Arduino mega und auch wenn der CS (SS) auf Pin 10 bleibt.

Das Problem lag darin das wenn ein Dynamixel Servo erst mal mit dem Befehl rotate angesprochen wird

kann er mit dem write Befehl keine Winkel mehr einstellen. ich weiss nicht ob da ein Fehler in der

hinterlegten C+ Datei ist.

Ich habe das Problem damit gelöst, indem ich die Servos am Orginal Controler angeschlossen habe und

Sie dort zurück auf Winkelstellung eingestellt habe .

Jetzt laufen sie .