PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Start mit Arduino?



ahave
22.05.2014, 08:55
hallo,

ich möchte programmieren lernen, habe bisher recht magere Kentnisse und bin auf der Suche nach einer geeigneten Platform. Die "Vorauswahl" habe ich eigentlich schon getroffen, sonst wäre ich ja nicht hier bei Arduino...

Ich möchte nicht Löten, nur in Ausnahmefällen, die Elektronikkenntnisse sind auch eher bescheiden, würde mich aber gerne z.B. mit sich bewegenden Robotern beschäftigen. Deshalb finde ich schonmal die Möglichkeit des "Zusammansteckens" einzelne Module gut.


Nun ist aber die Menge an verschiedenen Versionen schon recht groß, deshalb zunächst die Frage - welche Version würdet Ihr empfehlen?

Was bräuchte ich um anfangen zu können?

Wird der Arduino eigentlich in C++ programmiert?

Sisor
22.05.2014, 11:35
Was bräuchte ich um anfangen zu können?
IMHO ist ein Arduino UNO ideal. Klein, günstig, USB, recht viele Ausgänge, weit verbreitet, ideal zum Testen von Software und Hardware.
Dazu halt noch ein Breadboard, Kabel, diverse Sensoren, Motoren, LEDs, Widerstände...

Wird der Arduino eigentlich in C++ programmiert?
Theoretisch ja, praktisch wird meist nur eine kleine Teilmenge benutzt, für die Basis-C-Kenntnisse fast ausreichen. Ziel der Arduino-Entwickler war eine möglichst einfache Handhabbarkeit.

Rabenauge
22.05.2014, 13:12
Genau so isses.
Arduino ist betriebsfertig- auspacken, die IDE installieren, und zwei Minuten später läuft das erste Programm. Ausser nem ganz normalen USB-Kabel ist _kein_ weiteres Zubehör zum programmieren erforderlich.

Und wie Sisor schon sagt: man _kann_ auch baim Arduino wichtig in C++ programmieren, _muss_ das aber nicht, die IDE hat da so viel "vorgefertigtes", dass es ideal ist für Einsteiger, die ganzen wirklich komplizierten Sachen "braucht" man erstmal gar nicht.

Löten: nunja. Klar gibts nen Motorshield (sogar mehrere verschiedene), klar wird das nur einfach draufgesteckt, die Kabel angeschraubt und -fährt- aber früher oder später will man dann doch noch was mehr. Da müssen externe Sensoren verkabelt werden oder anderes, wo man sich einfach die Kabel dann doch selber macht, oder man baut was in nen Gehäuse ein, wo man die Bord-LED nicht mehr sehn kann, also ohne Lötkolben kommt man auch mitm Dino nicht wirklich weit.
Das geht dann echt nur mit LEGO (deren Robotersysteme im übrigen wirklich Klasse sind)-aber auch da ist man dann drauf angewiesen, was man fertig bekommt.
Ist aber nicht unbedingt Hexenwerk...

ahave
22.05.2014, 16:08
Hallo,

vielen Dank erst einmal für die Antworten...

Ich schwanke jetzt zunächst einmal zwischen dem UNO R3 und MEGA 2560 R3, aber vielleicht sollte ich erst erläutern was ich machen möchte:

mit diesem Chassis (http://www.ebay.de/itm/320969267864?_trksid=p2055119.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT) fahren.

Es hat 4 Motoren, sollte als Erstes mit einem US-Abstandsmessgerät ausgestattet werden, evtl. Bumper...

Weiter / später dachte ich an Bluetooth Kommunikation mit einem anderen Roboter oder PC, die Orientierung im Raum sollte durch einen Kompass verbessert werden, Linienfolgesensor wäre auch wünschenswert....

Ob jetzt ein LCD wirklich Sinn macht weiß ich nicht – die Realisierung der BT Kommunikation mit dem PC macht es eigentlich überflüssig...

Nicht, dass ich das Alles sofort realisieren will, ich möchte nur nicht zu früh vor der Erkenntnis stehen - ich hätte vielleicht doch besser etwas größeres als den Arduino genommen...

Die Vielfalt an den „shields“ ist ja irre. Wie viel davon verträgt der Arduino überhaupt?

btw: wie ist die Übertragung der Programme vom PC zum Arduino „organisiert“? Läuft es über einen Terminal, also UART?

Sisor
22.05.2014, 17:10
btw: wie ist die Übertragung der Programme vom PC zum Arduino „organisiert“? Läuft es über einen Terminal, also UART?
Es gibt eine freie Software namens Arduino-IDE. Damit schreibst, kompilierst und überträgst du die Programme. Das läuft über den Serial Port aka UART.
Es können natürlich auch mehrere Arduinos auf verschiedenste Art miteinander kommunizieren. Z.B. könnte ein Arduino Sensoren auswerten und die verarbeiteten Daten an einen zweiten schicken, der die Motorsteuerung o.ä. übernimmt.

ahave
22.05.2014, 18:44
also im gewissen Sinne "verteilte Inteligenz" - klingt nicht schlecht:-) Wie kommunizieren die arduinos?
Gruss ahave

Sisor
22.05.2014, 19:37
Wie kommunizieren die arduinos?
z.B. über UART, Software-Serial, Funk, Bluetooth, I2C...

Tipp: Wenn du dir die 'Löt-Allergie' abgewöhnen kannst, reicht 1 UNO zum Testen. Der 2.(3. ...) Arduino kann z.B. ein Pro Mini sein. Die gibts aus China für unter 3 Euro/Stück, haben zwar kein USB, können aber mit einem UNO programmiert werden.

ahave
22.05.2014, 20:53
Wenn du dir die 'Löt-Allergie' abgewöhnen kannst naja, So eine richtige Allergie ist ja auch nicht, ich mache es halt nur ungern...

Also ich rekapituliere mal, bevor ich mich ans Bestellen mache:

mit einem UNO (http://www.ebay.de/itm/Neu-Sainsmart-UNO-R3-Board-MEGA328P-ATMEGA16U2-Free-USB-Cable-For-Arduino-/380687954753?pt=Wissenschaftliche_Ger%C3%A4te&hash=item58a2c53341) (Chinesisch geht auch?) und einem Motor-shield (http://www.amazon.de/SainSmart-L293D-Shield-Arduino-Duemilanove/dp/B0081JPBA6/ref=sr_1_1?ie=UTF8&qid=1400783669&sr=8-1&keywords=motor+shield) (da steht sowas in der Beschreibung: Can drive 4 DC motors or 2 stepper motors or 2 Servo - ist es immer "entweder / oder"?) kann ich:

- die 4 Motoren des Chassis steuern
- mit einem SR04 (http://www.amazon.de/dp/B006CHFLR2/ref=wl_it_dp_o_pd_nS_ttl?_encoding=UTF8&colid=11M9NFDL0E96H&coliid=I1HBXTEATKHP1Y) oder Sharp (http://www.amazon.de/Sharp-DISTANZ-SENSOR-GP2Y0D02YK/dp/B003ANLQZW/ref=sr_1_1?ie=UTF8&qid=1400783475&sr=8-1&keywords=sharp+sensor) Sensor Hindernisse erkennen und ausweichen
- dazu brauche ich noch einen Servo
- accu des Chassis überwachen
- Bumper (Endschalter mit langem Hebel) überwachen

und es bleibt noch Reserve z.B. für BT?

Rabenauge
23.05.2014, 12:03
Uno vom Chinesen geht-zumindest wenn er von Sainsmart ist.
Deren aktuelle Version ist meiner Meinung nach besser als das Original, weil sie nicht nur die Steckerleisten rausgeführt haben, sondern die meisten Pins auch noch schön als dreipolige Anschlüsse. Zudem kann man das Ding auf 3.3V umschalten.
Es gibt auch ausgesprochen schlechte Nachbauten, die schon mal ihre Problemchen haben. Kannst auch den Mega 2560 von dem Laden nehmen- das Motorshield passt auch auf den!
Das Motorshield ist ne ältere Version, und richtig: die kann nicht alles gleichzeitig.
Meins bedient derzeit zwei Motoren UND nen Servo-kein Problem. Das Ding ist nicht übel, aber es belegt, grade beim UNO, fast alle Pins (von oben zugänglich sind dann nur noch die analogen, die auch nicht benutzt werden, und ein digitaler, deswegen ist der Mega besser, da hast du noch zwei Dutzend freie Pins dann. Kostet auch nich viel mehr..
mit nem Uno kannst du: das Motorshield betreiben, dazu einen HC-Sr04 (der braucht zwei Pins), Akku überwachen geht auch noch, da du noch vier analoge frei hast.
Blauzahn must du gucken, was die brauchen (mach ich nix mit), wenn du was I2C-fähiges auftreiben kannst, geht auch das (der I2C-Bus wäre noch frei). Stosstange langt digital- einen solchen Pin hast du ebenfalls oben zugänglich auf dem Motorshield.
Allerdings musst du schon da doch bisschen löten: die Analogpins sind zwar auf dem Motorshield da, aber keine Steckerleisten. Die musst du selber einlöten-ebenso den digitalen.

Das mit dem Servo (ich nehme an, dass du den Sensor schwenken willst) würd ich an deiner Stelle aber _erstmal_ lassen, es sei denn, du magst Herausforderungen-das wird eine!

ahave
23.05.2014, 17:25
Hallo Rabenauge,

danke erstmal für die ausführlichen Erläuterungen. Sehr aufschlussreich...

das mit dem Servo muss ja nicht sofort sein, es reicht wenn der US-Sensor erstmal nach vorne ausgerichtet ist...

Ich möchte ja im Prinzip erstmal mit Bewegungen und Kollisionsvermeidung anfangen. Sainsmart bietet ein Kit (http://www.ebay.de/itm/SainSmart-Mega-2560-R3-4WD-Mobile-Car-Gold-L298N-HC-SR04-V5-For-Arduino-/230974237020?pt=Wissenschaftliche_Ger%C3%A4te&hash=item35c723295c), welches diese Anforderungen abdecken würde. Könntest Du Dir das bitte noch einmal anschauen?

Was mich dort irritiert ist: Die bieten 4 Getriebemotoren an und nur ein Motorshield (es gehen nur zwei Motoren / Shield, oder habe ich es missverstanden?), an dem Foto sieht man aber 4 Ausgänge (zu den Motoren?). Auch scheint dieses Ding nicht steckbar zu sein?

noch eine Frage: Wäre ein Buch zu Arduino sinnvoll, oder soll/ kann ich mir das alles im Internet anlesen?

Rabenauge
23.05.2014, 18:09
Naja- der Sensor kann, wenn er gradeaus guckt, nur vermeiden, dass das Fahrzeug gegen ne Wand (oder die Katze, Oma, Staubsauger....) fährt.
Oder eben rausfinden, ob der Weg die nächsten Meter frei ist (hbs grad nicht im Kopf aber ich glaub, der Sensor schafft 4m). Er kann so nicht erkennen, ob er ebsser nach links oder rechts abbiegen sollte. Das müsste man dann per Software lösen (einfach auf der Stelle drehn und nachgucken)- für den Anfang reichts aber so. Später kannst du zweie montieren, die schräg vor gucken,d as geht dann besser. Und nach hinten auch noch welche- im Dutzend sind die Dinger billiger, und der Mega kann die auch alle ansteuern..

Ja, das Set ist nen recht brauchbarer Einstieg, denke ich. Und du hast recht: dort ist _nicht_ das-vergleichsweise bessere-Motorshield dabei, sondern nur ein Treiberbaustein für zwei Motoren.
Dafür aber ist der stärker- das Motorshield kann nur kurzzeitig ungefähr die Hälfte, Dauer ist mit 600mA angegeben.
Ausserdem kannst du auch höhere Spannungen einspeisen, beim Motorshield gehts, glaub ich, nur bis 9V.
Falls du nun Bedenken hast wegen den vier Motoren in dem Fahrzeug: es läuft sowieso auf ne Panzerlenkung hinaus, du kannst also die zwei Motoren einer Seite zusammen an einen Motorausgang schliessen.
Damit passt das alles soweit.
Das Sensorshield- naja. Ich persönlich halt das Ding für überflüssig, aber da du ja möglichst wenig löten willst- auch nützlich.

Was du wohl aber zusätzlich noch brauchen wirst sind nen paar Kabel, um alles zu verbinden, da seh ich nun nix bei..sowas z.B: http://www.ebay.de/itm/Female-To-Female-40p-20cm-1p-1p-Jumper-Ribbon-Wire-Dupont-Cable-Kabel-Arduino-/271479132132?pt=Elektromechanische_Bauelemente&hash=item3f356acfe4
Gibts mit Männchen, Weibchen, und gemischt.

Achja: mir kommt das zusammen da jetzt bisschen teuer vor-such mal obs das Roboter-Bündel nicht auch günstiger gibt, oder im Einzelkauf- die Chinesen haben mitunter merkwürdige Preisgestaltungen.
Teilweise ists echt so, dass drei Stück "irgendwas" zusammen weniger kosten als ein einzelnes..

Was _ich persönlich_ unbedingt zukaufen würde ist ein Display.
Dem kleinen Autochen würd nen mini-Oled gut stehen- ist billiger und besser als alles andere- wenn man so kleines noch lesen kann jedenfalls-notfalls können die auch grössere Schrift...
Aber: musst du selber wissen ob du eins willst, brauchst oder nich..

ahave
23.05.2014, 18:23
ja, das mit der Preisgestaltung bei den Chnesen ist wohl wahr...

die einzelnen Komponenten, zumindest die, die ich mir angeschaut habe, waren in der Summe teuerer als das Kit. Werde also nun das Ding bestellen, dauert ein paar Wochen - leider. Ich melde mich dann :-)

noch etwas zu den vier Rädern. Eigentlich dachte ich, wenn schon die Möglichkeit besteht, jedes einzeln anzutreiben, und was Richtung und Power betrifft über den Prozessor anzusteuen, möchte ich das auch nutzen - z.B. auf der Stelle drehen, wenn ich die Räder entsprechend ansteuere. Oder sollte ich mir diese Illusion abschminken?

Rabenauge
23.05.2014, 18:32
Such mal -Sainsmart hat _auch_ ein DE-Warenhaus. Allerdings gibts da nicht alles. Musst mal auf deren Webseite schauen. Lass dir aber nix von Holland schicken von denen-das dauert doppelt so lange wie aus China. Wahrscheinlich warten die Holländer immer, bis zufällig ne Postkutsc he in die passende Richtung fährt und gebens da mit oder was...
Und: die zwei Wochen hälste das aus...die Software kannst du dir ja schonmal besorgen (ich hab den Link grad nicht zur Hand, wo die den ganzen Kram liegen haben), und bisschen programmieren auch, da vergeht die Zeit schnell.

Buch kaufen-hm. Kann man natürlich machen aber: ich hab keins, und habs auch nie vermisst. Es gibt nen recht gutes deutsches Unterforum bei Arduino, wo man auch nicht unbedingt was gegen Nachbauten (erlaubt isses schliesslich, so wie Sainsmart es handhabt) hat, und einem immer geholfen wird.
Naja-und hier kannste ja auch fragen.
Wenn du nen Buch willst, kauf dir was- da gibts jede Menge aber: meist sind die entweder jetzt schon veraltet oder demnächst dann. Im Grunde findet man im Internet alles nötige, und vieles auch auf deutsch.
Kannst ja auch mal in ne Leihbücherei schauen, vielleicht haben die was, da kannst du erstmal reingucken und dann entscheiden.

Zu den Rädern: denk mal nach. Welchen Sinn sollte es machen, die alle vier einzeln anzusteuern?
Rein theoretisch könnte man da die Kurven _vielleicht_ noch etwas effektiver nehmen, aber wenn du die beiden linken rückwärts laufen lässt und die beiden rechten vorwärts, dreht das Ding auf der Stelle. Und wenn du die rechten Vollgas vorwärts, und die linken halbgas vorwärts ansteuerst, wirds nen Bogen fahren- da das annähernd stufenlos möglich ist, reicht das doch?

ahave
23.05.2014, 21:00
Also, ich habs jetzt bestellt :-) . Direkt bei sainsmart, also nicht über ebay, war sogar noch billiger, weil in $ bestellt und in € bezahlt. Mal sehen welche Lieferzeiten die haben...

Rabenauge
23.05.2014, 21:07
Wenns auch von China kommt, ist es nicht schneller..aber du hast nen paar Jahre ohne das Teil verbraucht, was machen da nen paar Tage. ;)

ahave
09.06.2014, 18:02
hallo,

ich habe die Teile nun bekommen, zusammengebaut und mache jetzt die ersten Tests mit den Motoren allein. Bei diesem code, den ich im Netz gefunden habe

#include <AFMotor.h>


//declaring the pins for the IN pins on the L298N
const int rightForwardPin = 6;//4;
const int rightBackwardPin = 7; //2;
const int leftBackwardPin = 8; //7;
const int leftForwardPin = 9; //5

int runTime = 5000;

void setup() {
//Stating that the pins are OUTPUT
pinMode(rightForwardPin, OUTPUT);
pinMode(rightBackwardPin, OUTPUT);
pinMode(leftForwardPin, OUTPUT);
pinMode(leftBackwardPin, OUTPUT);
}

//Looping to test the wheels of the car
void loop() {

forward();

stopCar();

backward();

stopCar();

left();

stopCar();

right();

stopCar();
}

//Setting the wheels to go forward by setting the forward pins to HIGH
void forward(){
digitalWrite(rightForwardPin, HIGH);
digitalWrite(rightBackwardPin, LOW);
digitalWrite(leftForwardPin, HIGH);
digitalWrite(leftBackwardPin, LOW);
delay(runTime);
}

//Setting the wheels to go backward by setting the backward pins to HIGH
void backward(){
digitalWrite(rightForwardPin, LOW);
digitalWrite(rightBackwardPin, HIGH);
digitalWrite(leftForwardPin, LOW);
digitalWrite(leftBackwardPin, HIGH);
delay(runTime);
}

//Setting the wheels to go right by setting the rightBackwardPin and leftForwardPin to HIGH
void right(){
digitalWrite(rightForwardPin, LOW);
digitalWrite(rightBackwardPin, HIGH);
digitalWrite(leftForwardPin, HIGH);
digitalWrite(leftBackwardPin, LOW);
delay(runTime);
}

//Setting the wheels to go left by setting the rightForwardPin and leftBackwardPin to HIGH
void left(){
digitalWrite(rightForwardPin, HIGH);
digitalWrite(rightBackwardPin, LOW);
digitalWrite(leftForwardPin, LOW);
digitalWrite(leftBackwardPin, HIGH);
delay(runTime);
}

//Setting the wheels to go stop by setting all the pins to LOW
void stopCar(){
digitalWrite(rightForwardPin, LOW);
digitalWrite(rightBackwardPin, LOW);
digitalWrite(leftForwardPin, LOW);
digitalWrite(leftBackwardPin, LOW);
delay(1000);
}


passiert ja nun noch nicht sehr viel. Der Roboter soll vorwärts fahren, halten, rückwärts fahren, auf der Stelle drehen usw. So weit so gut...

stelle ich ihn hoch, so dass die Räder frei durchdrehen können, ist alles ok, wenn er auf dem Boden steht, fährt er nur vor und zurück und wenn er drehen soll, zuckt er nur kurz in die Richtung in die er drehen soll. Im hochgebockten Zustand lassen sich auch die Räder relativ leicht mit der Hand anhalten - also ich hätte mehr "Power" erwartet...
Der Akku ist vollgeladen, hat 6xAA Zellen, 2000mAh...

woran kann das Liegen? Ich meine ich habe alles richtig verdrahtet...

könnte mir bitte jemand einen Tipp geben woran es liegen könnte?

Rabenauge
09.06.2014, 23:24
Am Programm.
Glaub ehrlich gesagt nicht, dass das zu deinem Motorshield überhaupt passt.
Das "alte" Motorshield erwartet nämlich auch PWM-Werte-in deinem "Programm" da seh ich nirgends sowas wie eine Drehzahlvorgabe.
WENN du das weiter oben genannte Motorshield hast (das Ding von Sainsmart, V 1.2 oder so) dann probiere mal das Programm unter Beispiele, AfMotor-> MotorTest.
Das Beispielprogramm zeigt sehr einfach, wie so nen Motor mit _diesem_ Shield angesteuert bzw. programmiert wird.
Ist kinderleicht auf alle vier Motoren zu erweitern.

ahave
10.06.2014, 14:30
hallo Rabenauge,

Du meinst sicher dieses Programm:

#include <AFMotor.h>

// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!

AF_DCMotor motor(4);

void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Motor test!");

// turn on motor
motor.setSpeed(200);

motor.run(RELEASE);
}

void loop() {
uint8_t i;

Serial.print("tick");

motor.run(FORWARD);
for (i=0; i<255; i++) {
motor.setSpeed(i);
delay(10);
}

for (i=255; i!=0; i--) {
motor.setSpeed(i);
delay(10);
}

Serial.print("tock");

motor.run(BACKWARD);
for (i=0; i<255; i++) {
motor.setSpeed(i);
delay(10);
}

for (i=255; i!=0; i--) {
motor.setSpeed(i);
delay(10);
}


Serial.print("tech");
motor.run(RELEASE);
delay(1000);
}

meine verdrahtung sieht folgendermaßen aus:

- zwei Motorshields L298N (http://www.sainsmart.com/sainsmart-l298n-dual-h-bridge-stepper-motor-driver-controller-board-module-for-arduino-robot.html) von Sainsmart. Zwei deshalb, weil ich später jedes Rad einzeln mit den sog. "Momentumwheels" einsetzetn möchte...


- die Jumper auf den Motorshields verbinden jeweils 5V und ENA bzw. 5V und ENB (wie geliefert)

- Motor LV angeschlossen an Shield-1 OUT3/4
- Motor RV angeschlossen an Shield-1 OUT1/2
- Motor LH angeschlossen an Shield-2 OUT3/4
- Motor RH angeschlossen an Shield-1 OUT1/2

die beiden Motorshields sind paralell am Akku angeschlossen über GND und VCC

da ich dem Programm nicht entnehmen konnte über welche der unzählicen Pins des Megaboards die Motorshields angesteuert werden sollen haben ich rumprobiert, mit folgendem Ergebnis:

Pin 8 (Digital) des Sensorshields V5 (aufgesteckt am megaboard) ist verbunden:

- mit Shield-1-IN1 - der Motor RH dreht in Fahrtrichtung gesehen Rückwärts
- mit Shield-1-IN2 - der Motor RH dreht in Fahrtrichtung gesehen Vorwärts
- mit Shield-1-IN3 - der Motor LH dreht in Fahrtrichtung gesehen Rückwärts
- mit Shield-1-IN4 - der Motor RH dreht in Fahrtrichtung gesehen Vorwärts

entsprechend verhält es sich bei den Motoren VL und VR beim Anschluss an Motorshield-2.



ich kann daraus nur schließen, dass allle vier Motoren richtig verdrahtet sind, woran erkenne ich aber aus dem code warum der Pin 8 jetzt angesteuert wird?

ach so, noch etwas:

beim ablauf des Programms dreht Motor RH mit Pausen Rückwärts (Verbindung Pin8 mit Shield-1-IN1), im serialmonitor wird dicht an einander "ticktocktech" ausgegeben. Von den anderen Programmsequenzen mit z.B. Beschleunigen oder Richtungswechsel keine Spur...

ich muss zugeben dass verwirrt mich etwas :-(

Rabenauge
10.06.2014, 19:17
Hättste das Motorshield aus deiner vorherigen Einkaufsliste genommen...
Erstens _kenne_ ich das Ding (benutz es selber ab und an), zweitens kann es mehr. Ok: es blockiert mehr Pins aber beim Mega...der hat noch lange genug.
Und: das Shield bekommste ungefähr für den Preis eines deiner Treiberdinger da...und das steuert dir deine vier Motoren auch an.

Bei den Reviews steht übrigens, dass so manch einer wohl mit diesen Dingern seine Probleme hat.

Aber gut-du hast die Dinger nunmal da und funktionieren wirds schon.
Allerdings wird dir die AFMotor nun mal gar nix nützen, schätze ich.

Also:
Hast du ne ANLEITUNG (bitte nicht irgendwelches Internetgesülz, sondern wenns geht vom Hersteller) zu dem Ding?? Mir schwant da nämlich was, aber ich würd gerne dazu nen Anschlusschema sehn.
Hast du _irgendeine_ Beispielsoftware dafür? Bibliothek, Beispielprogramm...
Während du antwortest, such ich mal, was ich von Sainsmart so an Dokumenten da hab-vielleicht ist was zu dem Ding bei...

Und nochwas: vergiss mal das zweite der Dinger für eine Weile- wir bringen _eines_ davon zum laufen, alles andere fangen wir gar nich an.
Wenn das eine läuft, kümmern wir uns um Nummer 2 (mir schwant auch da noch ne Kleinigkeit)...

So, Nachtrag.
Ich hab mir mal das Beispiel-ähhh-Programm von Sainsmart besorgt.
Mehr an Doku hat der Laden offenbar nich zu dem Ding aber:

/SainSmart L298N

int pin1=8;

int pin2=9;

int speedpin1=11;

int pin3=6;

int pin4=7;

int speedpin2=10;

void setup()

{

pinMode(pin1,OUTPUT);

pinMode(pin2,OUTPUT);

pinMode(speedpin1,OUTPUT);

pinMode(pin3,OUTPUT);//

pinMode(pin4,OUTPUT);

pinMode(speedpin2,OUTPUT);

}

void loop()

{

digitalWrite(speedpin1,100);

delay(2000);

digitalWrite(pin1,LOW);

digitalWrite(pin2,HIGH);

digitalWrite(pin3,LOW);

digitalWrite(pin4,HIGH);

digitalWrite(speedpin2,100);

delay(2000);

digitalWrite(pin1,HIGH);

digitalWrite(pin2,LOW);

digitalWrite(pin3,HIGH);

digitalWrite(pin4,LOW);

digitalWrite(pin1,HIGH);

digitalWrite(pin2,HIGH);

digitalWrite(pin3,HIGH);

digitalWrite(pin4, HIGH)

delay(2000);

}

Probier den mal aber setz die Jumper richtig (nein, ich weiss nicht, wie..)

ahave
10.06.2014, 20:38
hallo Rabenauge,

danke erstmal dass Du Dich so reihängst...


Hättste das Motorshield aus deiner vorherigen Einkaufsliste genommen...
Erstens _kenne_ ich das Ding (benutz es selber ab und an), zweitens kann es mehr. Ok: es blockiert mehr Pins aber beim Mega...der hat noch lange genug.
Und: das Shield bekommste ungefähr für den Preis eines deiner Treiberdinger da...und das steuert dir deine vier Motoren auch an.ich habe es nur genommen, weils in dem kompletten Bausatz dabei war. Bei den Pins bin ich sowieso noch unsicher - beim draufstecken des Motorshields auf den Mega wären ja quasi "alle" Pins zumindest abgedeckt, so dass man überhaupt nicht drankommt - deshalb fand ich die nicht-steckbaren eigentlich besser, da die ja sowieso nur für die Motoren da sind und wenn sie neben den Motoren untergebracht sind...



Hast du ne ANLEITUNG (bitte nicht irgendwelches Internetgesülz, sondern wenns geht vom Hersteller) zu dem Ding?? Mir schwant da nämlich was, aber ich würd gerne dazu nen Anschlusschema sehn.siehe Anhang...



Und nochwas: vergiss mal das zweite der Dinger für eine Weile- wir bringen _eines_ davon zum laufen, alles andere fangen wir gar nich an.
Wenn das eine läuft, kümmern wir uns um Nummer 2 (mir schwant auch da noch ne Kleinigkeit)...ok...



Ich hab mir mal das Beispiel-ähhh-Programm von Sainsmart besorgt.
Mehr an Doku hat der Laden offenbar nich zu dem Ding aber:
den gleichen Code haben sie mir auf Anfrage auch zugeschickt. Probleme hatte ich mit den speedpins 1 und 2, da muss man offensichtlich auch irgendwelche Pins verbinden wie die 8. 9, 6 und 7 mit den INT1,2, 3,4 verbinden...



Probier den mal aber setz die Jumper richtig (nein, ich weiss nicht, wie..) meinst Du die jumper an dem Motorshield? Den Code werde ich noch testen (mit den Jumpern...

Rabenauge
11.06.2014, 00:52
Sainsmart hat nen -im Prinzip-frei zugänglichen Downloadbereich. ;)
Dort finden sich sämtliche Anleitungen-soweit sie (meistens) von anderen mehr oder weniger abgeschrieben wurden.
Dein PDF da ist-wohl Eingebau von denen, und entsprechend mies. Naja...

Hab noch mehr solche Anleitungen von denen, teils grauslig...

Da: http://hacker.instanet.net/forums/viewtopic.php?f=4&t=13hab ich was gefunden, was auf _dieses_ Ding zu passen _könnte_ (leider kein Foto bei, es gibt was ähnliches bei Sparkfun, aber eben _ähnlich_-nicht so).

Versuch dich dort mal klug zu lesen. Ich kanns nicht wirtklich nachvollziehen, weil ich motormässig anders unterwegs bin-hätt ich so nen Ding hier, wär der Drops schon gelutscht.

Bitte benutze _genau_ die angegebenen Pins...zu den dort verlinkten (bzw. im Text enthaltenen) Beispielen.
Vermutlich kommts da wirklich drauf an.
Was wie anzuschliessen ist, steht eigentlich bei (und den Sainsmart-Fotos nach kann das so auch klappen) auch wenn ich nur zwei Jumper sehe, da wird aber von vieren geredet..
Für weiteres: besorg dir mal Fritzing(das Programm kostet nix und ist, grad für Arduino-Basteleien einfach Klasse: nach nem halben Jahr weiss _ich_ nämlich nicht mehr, was ich mal wo verkabelt hatte. So kann man alles schön dokumentieren. Weiss zwar nicht, ob das Ding dort in der Bibliothek ist, aber man kann auch Zettelchen ankleben, als "Dummys", um dranzuschreiben, wo das Kabel hingeht.
Dann mach mir mal ne Skizze _deiner_ Verkabelung.

Was das Motorshield angeht: alles Quatsch: der MEGA ist länger als nen UNO. Die gesamte hintere Steckerleiste (die Doppelte, dies beim Uno gar nicht gibt) bleibt frei zugänglich. Praktischerweise damit z.B. auch die SPI-Schnittstelle..;)
Analog-Pins sind beim Motorshield nach oben durchgeführt (braucht man nur noch Steckerleisten oder Buchsen rauflöten, die haben dann sogar schick ne Stromversorgung pro Pin), I2C ist auch noch erreichbar (mitm UNO auch, weil die ebenfalls hoch geführt ist, beim MEGA sind da aber Analogpins), also alles was man braucht ist ohne weiteres noch zu erreichen-mitm Uno wirds dünn, da sind nur zwei oder drei Digitale und die paar analogen Pins noch frei, sowie I2C.
Damit kämpf ich grade mit meinem Buggy: mit den paar übrigen Pins irgendwie noch mehrere Funktionen-ist spannend.

Für deinen Roboter würd die Austattung übrigens knapp reichen: UNO,das Motorshield, da haste noch die Möglichkeit, ohne Tricksen 2 US-Sensoren zu verbauen. Mit tricksen dürften 3-5 möglich sein.
I2C wäre dann noch verfügbar für weitere "Wichtige" Sachen-Display z.B. (hat irgendwie jeder Roboter, der bisschen was auf sich hält heute), eventuell weitere Sensoren.
Problem wäre das Servo: zwar kann das Motorshield davon zweie versorgen, aber ich glaub, nicht, wenn alle vier Motoren benutzt werden (ich hab zweie dran, da gehts), da müsste man im laufenden Betrieb immer mal die Betriebsart wechseln.

ahave
11.06.2014, 15:23
an dem Anderen bin ichn noch dran, habe aber ein Schaltplan für das Modul gefunden

28367

- - - Aktualisiert - - -

so, jetzt habe ich folgendes gemacht:

von dieser webseite: (http://hacker.instanet.net/forums/viewtopic.php?f=4&t=13hab)

mit dieser einstellung:


Jumpers:
ENA Removed
ENB Removed
PWM1 Installed - wahrscheinlich durch die Verbindung ENA - Arduino3
PWM2 Installed - ENB verbunden mit Arduino6

On the header:
GND ==> GND on Arduino
5V ==> N/C (5V Logic power is available from on-board regulator)
ENB ==> Arduino 6
ENA ==> Arduino 3
IN1 ==> Arduino 2
IN2 ==> Arduino 4
IN3 ==> Arduino 7
IN4 ==> Arduino 8

Power Terminal Block:
5V ==> N/C
GND ==> Ground on Motor Power Supply
VCC ==> +12V (for 12 volt motor)

OUT1 Terminal Block:
Pin1 ==> Motor 1 +
Pin2 ==> Motor 1 -

OUT2 Terminal Block:
Pin1 ==> Motor 2 +
Pin2 ==> Motor 2 -

diesen
/*
L298N Test Code
hacker.instanet.net
Tim Laren timl@instanet.com
This example code is in the public domain.
*/

#define OUT1PIN1 2 // H-bridge OUT1.1
#define OUT1PIN2 4 // H-bridge OUT1.2
#define ENABLE1 3 // H-bridge Ena 1
#define OUT2PIN1 7 // H-bridge OUT2.1
#define OUT2PIN2 8 // H-bridge OUT2.2
#define ENABLE2 6 // H-bridge Ena 2


void setup() {
// setup motor pins
pinMode(OUT1PIN1, OUTPUT);
pinMode(OUT1PIN2, OUTPUT);
pinMode(ENABLE1, OUTPUT);

digitalWrite(ENABLE1, HIGH); // set the enables to high
}


void loop() {
digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low
digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high

delay(5000);

digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high
digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low

delay(5000);
}

Motor RH dreht ca. 5sec, stoppt und dreht 5sec in andere Richtung

jetzt werde ich versuchen das für zwei Motoren zu erweitern...


edit:

zunächstmal geht auch Beschleunigung - mit diesem
/*
L298N Test Code w/ Speed Control
hacker.instanet.net
Tim Laren timl@instanet.com
This example code is in the public domain.
*/

#define OUT1PIN1 2 // H-bridge OUT1.1
#define OUT1PIN2 4 // H-bridge OUT1.2
#define ENABLE1 3 // H-bridge Ena 1
#define OUT2PIN1 7 // H-bridge OUT2.1
#define OUT2PIN2 8 // H-bridge OUT2.2
#define ENABLE2 6 // H-bridge Ena 2

void setup() {
// setup Motor 1 pins
pinMode(OUT1PIN1, OUTPUT);
pinMode(OUT1PIN2, OUTPUT);

// setup Motor 2 pins
pinMode(OUT2PIN1, OUTPUT);
pinMode(OUT2PIN2, OUTPUT);
}

void loop() {
digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low
digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high
Ramp(ENABLE1,0,255,1,10);
Ramp(ENABLE1,255,0,-1,10);
digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high
digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low
Ramp(ENABLE1,0,255,1,10);
Ramp(ENABLE1,255,0,-1,10);
}

void Ramp(int Motor, int Start, int End, int Inc, int Del) {
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/
for(int i=Start;i<End;i = i + Inc) {
analogWrite(Motor, i); // Motor 1 Speed
delay(Del);
}
}

Rabenauge
11.06.2014, 16:04
Läuft also?
Na siehste. Freut mich echt für dich...
Find ja die Ansteuerung der Dinger nen bisschen abenteuerlich, aber womöglich ists in der Praxis gar nicht mal so. Wie gesagt: hab ja das Teil nicht (und werds demnächst auch nicht brauchen)- nichts desto Trotz interessierts mich. Ab und zu mal übern Tellerrand gucken....

Also erzähl mal weiter...

ahave
11.06.2014, 21:08
ja, es läuft, zumindest ansatzweise...

aber das "Kratzen am Kopf" lässt nicht lange auf sich warten. Ich habe den Code für die Beschleunigung für zwei Motoren erweitert:

/*
L298N Test Code w/ Speed Control
hacker.instanet.net
Tim Laren timl@instanet.com
This example code is in the public domain.
*/

#define OUT1PIN1 2 // H-bridge OUT1.1
#define OUT1PIN2 4 // H-bridge OUT1.2
#define ENABLE1 3 // H-bridge Ena 1
#define OUT2PIN3 7 // H-bridge OUT2.3
#define OUT2PIN4 8 // H-bridge OUT2.4
#define ENABLE2 6 // H-bridge Ena 2

void setup()
{
// setup Motor 1 pins
pinMode(OUT1PIN1, OUTPUT);
pinMode(OUT1PIN2, OUTPUT);

// setup Motor 2 pins
pinMode(OUT2PIN3, OUTPUT);
pinMode(OUT2PIN4, OUTPUT);
}

void loop()
{
//Motor_1
digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low
digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high
digitalWrite(OUT2PIN3, LOW); // set leg 3 of the H-bridge low
digitalWrite(OUT2PIN4, HIGH); // set leg 4 of the H-bridge high
Ramp(ENABLE1,0,255,1,10);
Ramp(ENABLE2,0,255,1,10);
//Motor_2
digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high
digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low
digitalWrite(OUT2PIN3, HIGH); // set leg 3 of the H-bridge high
digitalWrite(OUT2PIN4, LOW); // set leg 4 of the H-bridge low
Ramp(ENABLE1,255,0,-1,10);
Ramp(ENABLE2,255,0,-1,10);

}

void Ramp(int Motor, int Start, int End, int Inc, int Del)
{
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/
for(int i=Start;i<End;i = i + Inc)
{
analogWrite(Motor, i); // Motor 1 Speed
delay(Del);
}
}
zumindest laufen beide Motoren. Allerdings versetzt - wenn Du verstehts was ich meine. Ich ahne, dass es zum einen mit dem delay in der Ramp-Funktion hat. Habe aber keine Ahnung wie ich das angehen soll? Zum Anderen evtl. an den getrennten Aufrufen dieser Funktion für links/rechts. Muss ich die Funktion irgendwie für beide Motoren ändern/erweitern, oder ist da evtl. noch ein logischer Fehler?

ich habe schon alls Mögliche in der Reihenfolge der Befehlszeilen zu verändern versucht - das hier ist noch das beste Ergebnis - nur so fährt kein Roboter...

schaus Du bitte mal drüber?

Rabenauge
11.06.2014, 23:34
Habs mir mal in die IDE gezerrt-liest sich da einfach besser. :)
Klar laufen die beiden Motoren nacheinander, denn die Funktion Ramp() enthält ne Schleife.
Heisst: die wird erstmal _komplett_ durchlaufen, ehe das Hauptprogramm weiter läuft.
Somit wird Motor1 erstmal hochlaufen gelassen, und _dann_ wird das Spiel mit Motor2 wiederholt.

Mal ehrlich: ich kenn den Typen nicht, der das Programm geschrieben hat und will auch nix schlechtes sagen, aber das ist bisschen scheusslich gecodet.

Und zu dir: nen paar Grundlagen wären von Vorteil- hättest du die, wärst du da selber drauf gekommen, dass das delay() in der Funktion Ramp _nicht_ das eigentliche Übel ist.
Das delay beträgt 10ms- das ist nötig, damit der Motor überhaupt den jeweiligen Wert erstmal erreichen kann (von Null auf hundert kann auch nen Elektromotor nich)- kannst du ausprobieren: verändere den Wert mal und guck zu, wie die Rampe langsamer oder schneller durchlaufen wird.
Im Prinzip funktioniert das hochlaufen ohne das delay() auch- aber möglicherweise nicht ganz korrekt, eben weil zu schnell hochgeregelt wird. Praktisch beim fahren (meistens) recht egal, aus technischer Sicht aber korrekt umgesetzt.

so ganz blick ich das Chaos mit den Pins nicht- die ENABLE-Pins steuern die PWM, das ist klar aber:
Welche Pins steuern welchen Motor?

Das ist, dank der chaotischen Namen, nicht rauszulesen.

Tante Edit fügt hinzu: ok, ich habs.

Lesen muss man können-steht doch drin. Wenn wir aber hier weiter basteln, ändern wir da nen paar Namen _sinnvoll_.

Ich hab dir mal die Zuweisung der Motoren _in_ die Schleife gepackt, somit sollten die beiden Motoren synchron* laufen nun, und zwar beide erst hoch, dann wirder runter:


#define OUT1PIN1 2 // H-bridge OUT1.1
#define OUT1PIN2 4 // H-bridge OUT1.2
#define ENABLE1 3 // H-bridge Ena 1
#define OUT2PIN3 7 // H-bridge OUT2.3
#define OUT2PIN4 8 // H-bridge OUT2.4
#define ENABLE2 6 // H-bridge Ena 2

void setup()
{
// setup Motor 1 pins
pinMode(OUT1PIN1, OUTPUT);
pinMode(OUT1PIN2, OUTPUT);

// setup Motor 2 pins
pinMode(OUT2PIN3, OUTPUT);
pinMode(OUT2PIN4, OUTPUT);
}

void loop()
{
//Motor_1
digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low
digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high
digitalWrite(OUT2PIN3, LOW); // set leg 3 of the H-bridge low
digitalWrite(OUT2PIN4, HIGH); // set leg 4 of the H-bridge high
Ramp(0,255,1,10);
/* Ramp(ENABLE2,0,255,1,10);
//Motor_2
digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high
digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low
digitalWrite(OUT2PIN3, HIGH); // set leg 3 of the H-bridge high
digitalWrite(OUT2PIN4, LOW); // set leg 4 of the H-bridge low */
Ramp(255,0,-1,10);
// Ramp(ENABLE2,255,0,-1,10);

}

void Ramp(int Start, int End, int Inc, int Del)
{
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/
for(int i=Start;i<End;i = i + Inc)
{
analogWrite(ENABLE1, i); // Motor 1 Speed
analogWrite(ENABLE2,i); // Motor 2 Speed
delay(Del);
}
},

Sag mir bitte, ob das so funktioniert, ich hab das mal eben in ner Minute umgeschustert.
Falls es das tut: deine Geschichten hab ich nur auskommentiert, du solltest also recht einfach sehen, _was_ ich geändert hab. Verstehst du, warum?

ahave
12.06.2014, 17:13
ja, es funktioniert so. Ich glaube ich habe auch deine Änderungen verstanden. Ich habe noch meine Verdrahtung ein Bischen aufgeräumt und auch die Verbindungen zwischen den Motorshields und dem Megaboard so gelegt, dass sie nicht kreuz & quer gehen. Man hat da schon recht viel Freiheiten bei de defines...

Habe den Code für 4 Motoren erweitert und vor- und zurück Umschalten:
//bridge S1

#define OUT1PIN_1 11 // H-bridge_1 OUT1.1
#define OUT1PIN_2 9 // H-bridge_1 OUT1.2
#define ENABLE_A1 10 // H-bridge_1 Enable A/1
#define OUT2PIN_3 8 // H-bridge_1 OUT2.3
#define OUT2PIN_4 7 // H-bridge_1 OUT2.4
#define ENABLE_B1 6 // H-bridge_1 Enable B/2

//bridge S2

#define OUT3PIN_1 4 // H-bridge_2 OUT1.1
#define OUT3PIN_2 3 // H-bridge_2 OUT1.2
#define ENABLE_A2 0 // H-bridge_2 Enable A/1
#define OUT4PIN_3 2 // H-bridge_2 OUT2.3
#define OUT4PIN_4 1 // H-bridge_2 OUT2.4
#define ENABLE_B2 5 // H-bridge_2 Enable B/2


void setup()
{
// setup Motor 1 pins
pinMode(OUT1PIN_1, OUTPUT);
pinMode(OUT1PIN_2, OUTPUT);

// setup Motor 2 pins
pinMode(OUT2PIN_3, OUTPUT);
pinMode(OUT2PIN_4, OUTPUT);

// setup Motor 3 pins
pinMode(OUT3PIN_1, OUTPUT);
pinMode(OUT3PIN_2, OUTPUT);

// setup Motor 4 pins
pinMode(OUT4PIN_3, OUTPUT);
pinMode(OUT4PIN_4, OUTPUT);



}

void loop()
{
//Motor_1 & 2 vorwärts
digitalWrite(OUT1PIN_1, LOW); // set leg 1 of the H-bridge_1 low
digitalWrite(OUT1PIN_2, HIGH); // set leg 2 of the H-bridge_1 high
digitalWrite(OUT2PIN_3, LOW); // set leg 3 of the H-bridge_1 low
digitalWrite(OUT2PIN_4, HIGH); // set leg 4 of the H-bridge_1 high

//Motor_3 & 4 vorwärts
digitalWrite(OUT3PIN_1, LOW); // set leg 1 of the H-bridge_2 low
digitalWrite(OUT3PIN_2, HIGH); // set leg 2 of the H-bridge_2 high
digitalWrite(OUT4PIN_3, LOW); // set leg 3 of the H-bridge_2 low
digitalWrite(OUT4PIN_4, HIGH); // set leg 4 of the H-bridge_2 high
Ramp(0,255,1,10);

//Motor_1 & 2 rückwärts
digitalWrite(OUT1PIN_1, HIGH); // set leg 1 of the H-bridge_1 low
digitalWrite(OUT1PIN_2, LOW); // set leg 2 of the H-bridge_1 high
digitalWrite(OUT2PIN_3, HIGH); // set leg 3 of the H-bridge_1 low
digitalWrite(OUT2PIN_4, LOW); // set leg 4 of the H-bridge_1 high

//Motor_3 & 4 rückwärts
digitalWrite(OUT3PIN_1, HIGH); // set leg 1 of the H-bridge_2 low
digitalWrite(OUT3PIN_2, LOW); // set leg 2 of the H-bridge_2 high
digitalWrite(OUT4PIN_3, HIGH); // set leg 3 of the H-bridge_2 low
digitalWrite(OUT4PIN_4, LOW); // set leg 4 of the H-bridge_2 high
Ramp(0,255,1,10);

}

void Ramp(int Start, int End, int Inc, int Del) //int Motor entfernt
{
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/

for(int i=Start;i<End;i = i + Inc)
{
analogWrite(ENABLE_A1, i); // Motor 1 enable
analogWrite(ENABLE_B1, i); // Motor 2 enable
analogWrite(ENABLE_A2, i); // Motor 3 enable
analogWrite(ENABLE_B2, i); // Motor 4 enable
delay(Del);
}

}

thanks erstmal, werde nun weiter experimentieren...

Rabenauge
12.06.2014, 17:29
Funktionierts denn auch?
Einige Pins müssen PWM bekommen (die für die Drehzahlregelung)- das geht nicht mit jedem Pin!

Die Zuweisungen würd ich nen bisschen aufräumen (und vor allem sinnvollere Namen geben), das erleichtert die Sache ungemein, vor allem später, wenn das Ding mehr machen soll als vorwärts und rückwärts fahren.

ahave
12.06.2014, 17:48
eigentlich ja, es lief gut, aber beim Nachschauen habe ich festgestellt, dass die Pins 0 und 1 mit RX/TX gekennzeichnet waren, habe es nun auf die Pins 2-13 verschoben, alle mit PWM...

danke für den tipp..

Rabenauge
12.06.2014, 19:14
Fein. Ist halt das gute am Mega- gibt immer irgendwie noch nen Pin...beim UNO ist das teilweise ziemlich herausfordernd.

Wenn du bisschen mit dem Ding rumfährst dann, erzähl mal wie die Karre so läuft, was sie kann, was nicht...interessiert bestimmt nicht nur mich.

ahave
13.06.2014, 13:04
bei der definition der pins:

//bridge S1

#define S1_IN_1 11 // H-bridge_1 OUT1.1
#define S1_IN_2 10 // H-bridge_1 OUT1.2
#define S1_ENB_M_2 50 // H-bridge_1 Enable motor-2
#define S1_IN_3 9 // H-bridge_1 OUT2.3
#define S1_IN_4 8 // H-bridge_1 OUT2.4
#define S1_ENA_M_4 51 // H-bridge_1 Enable motor-4

brauche ich die pins mit PWM eigentlich für OUT, oder für die ENABLES? Ich tippe auf enables, weil bei der definition hier sind die ENB pins (50,51) digital, er fährt, oder eben nicht, beschleunigt aber nicht. Richtig?

Rabenauge
13.06.2014, 13:56
Die "Enable"-Pins sind die, die die Drehzahl steuern, das ist richtig. Erkennst du hier:


analogWrite(ENABLE1, i); // Motor 1 Speed
analogWrite(ENABLE2,i); // Motor 2 Speed

Dort werden die "analog" geschrieben-sprich, da wird der PWM-Wert ausgegeben.
Die anderen beiden (pro Motor) scheinen lediglich umgepolt zu werden (LOW legt den Pin auf Masse, HIGH auf 5V), um quasi den Motor umzupolen, für vorwärts und rückwärts.
Lass dich nicht davon beirren, dass auch die Enable-Pins Digitalpins sind, das macht nix!
Auch kann man die ohne weiteres Digital beschreiben (dann bleibt er HIGH so lange ich ihn nicht auf LOW setze) oder eben "analog"- das ist nix anderes als ne Folge von zeitlich abgestimmten HIGH`s und LOW`s.

Aber damits einfach geht, müssen eben die enable-Leitungen (Vorschlag: nenn sie einfach mal PWM1-4, wirds besser verständlich) an Pins liegen, die der Arduino als PWM-Pins nutzen kann.
Bei den anderen Leitungen ist das Wurst, da kannst du alles für nehmen.

ahave
14.06.2014, 17:09
Hallo Rabenauge,
Es klappt immer noch nicht. Beim hochgebocktem Chassis schon, sobald das Ding auf dem Boden steht, fährt es vor und zurück, Er zuckt nur mal kurz nach links. Drehen auf der Stelle geht einfach nicht. Auch die Räder lassen sich leicht festhalten, wenn die Motoren drehen. Könntest Du Dir bitte die dreh-Funktion anschauen? Evtl. ohne der Rampe? Länger drehen?


Hier noch ein paar daten...

Du wolltest eine stromlaufplan des Chassis:

28409

die zusätzlichen Verbindungen sehen so aus:
----------------------------------------------------------------------

Farbe Pin Motor-shield

br 8 S2_ENA_M_3
sw 9 S2_ENB_M_1
gn 53 S2_IN_1
ws 51 S2_IN_2
or 49 S2_IN_3
ge 47 S2_IN_4

rt 10 S1_ENA_M_4
br 11 S1_ENB_M_2
gr 52 S1_IN_1
vi 50 S1_IN_2
sw 48 S1_IN_3
bl 46 S1_IN_4
-------------------------------------------------------------------------
das ist der code:

//bridge S1

#define S1_IN_1 52 // H-bridge_1 OUT1.1
#define S1_IN_2 50 // H-bridge_1 OUT1.2
#define S1_ENB_M_2 11 // H-bridge_1 Enable motor-2
#define S1_IN_3 48 // H-bridge_1 OUT2.3
#define S1_IN_4 46 // H-bridge_1 OUT2.4
#define S1_ENA_M_4 10 // H-bridge_1 Enable motor-4

//bridge S2

#define S2_IN_1 53 // H-bridge_2 OUT1.1
#define S2_IN_2 51 // H-bridge_2 OUT1.2
#define S2_ENA_M_3 8 // H-bridge_2 Enable motor-3
#define S2_IN_3 49 // H-bridge_2 OUT2.3
#define S2_IN_4 47 // H-bridge_2 OUT2.4
#define S2_ENB_M_1 9 // H-bridge_2 Enable motor-1

// boolean running = false;

void setup()
{
// setup Motor 1 pins
pinMode(S1_IN_1, OUTPUT);
pinMode(S1_IN_2, OUTPUT);

// setup Motor 2 pins
pinMode(S1_IN_3, OUTPUT);
pinMode(S1_IN_4, OUTPUT);

// setup Motor 3 pins
pinMode(S2_IN_1, OUTPUT);
pinMode(S2_IN_2, OUTPUT);

// setup Motor 4 pins
pinMode(S2_IN_3, OUTPUT);
pinMode(S2_IN_4, OUTPUT);
}
void vorwaerts()

{
//Motor_1 & 2 vorwärts
digitalWrite(S1_IN_1, LOW); // set leg 1 of the H-bridge_1 low
digitalWrite(S1_IN_2, HIGH); // set leg 2 of the H-bridge_1 high
digitalWrite(S1_IN_3, LOW); // set leg 3 of the H-bridge_1 low
digitalWrite(S1_IN_4, HIGH); // set leg 4 of the H-bridge_1 high

//Motor_3 & 4 vorwärts
digitalWrite(S2_IN_1, LOW); // set leg 1 of the H-bridge_2 low
digitalWrite(S2_IN_2, HIGH); // set leg 2 of the H-bridge_2 high
digitalWrite(S2_IN_3, LOW); // set leg 3 of the H-bridge_2 low
digitalWrite(S2_IN_4, HIGH); // set leg 4 of the H-bridge_2 high
Ramp(0,255,2,10);
}
void rueckwaerts()
{
//Motor_1 & 2 rückwärts
digitalWrite(S1_IN_1, HIGH); // set leg 1 of the H-bridge_1 low
digitalWrite(S1_IN_2, LOW); // set leg 2 of the H-bridge_1 high
digitalWrite(S1_IN_3, HIGH); // set leg 3 of the H-bridge_1 low
digitalWrite(S1_IN_4, LOW); // set leg 4 of the H-bridge_1 high

//Motor_3 & 4 rückwärts
digitalWrite(S2_IN_1, HIGH); // set leg 1 of the H-bridge_2 low
digitalWrite(S2_IN_2, LOW); // set leg 2 of the H-bridge_2 high
digitalWrite(S2_IN_3, HIGH); // set leg 3 of the H-bridge_2 low
digitalWrite(S2_IN_4, LOW); // set leg 4 of the H-bridge_2 high
Ramp(0,255,2,10);
}
void drehen_links()
{
//Motor_1 & 2 vorwärts
digitalWrite(S1_IN_1, HIGH); // set leg 1 of the H-bridge_1 low
digitalWrite(S1_IN_2, LOW); // set leg 2 of the H-bridge_1 high
digitalWrite(S1_IN_3, LOW); // set leg 3 of the H-bridge_1 low
digitalWrite(S1_IN_4, HIGH); // set leg 4 of the H-bridge_1 high

//Motor_3 & 4 rückwärts
digitalWrite(S2_IN_1, HIGH); // set leg 1 of the H-bridge_2 low
digitalWrite(S2_IN_2, LOW); // set leg 2 of the H-bridge_2 high
digitalWrite(S2_IN_3, LOW); // set leg 3 of the H-bridge_2 low
digitalWrite(S2_IN_4, HIGH); // set leg 4 of the H-bridge_2 high
Ramp_dreh(0,255,2,20);
}

void loop()
{
vorwaerts();
rueckwaerts();
drehen_links();
}

void Ramp(int Start, int End, int Inc, int Del) //int Motor entfernt
{
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/

for(int i=Start;i<End;i = i + Inc)
{
analogWrite(S1_ENA_M_4, i); // Motor 4 enable
analogWrite(S1_ENB_M_2, i); // Motor 2 enable
analogWrite(S2_ENA_M_3, i); // Motor 3 enable
analogWrite(S2_ENB_M_1, i); // Motor 1 enable
delay(Del);
}

}

void Ramp_dreh(int Start, int End, int Inc, int Del) //int Motor entfernt
{
/* Ramps from PWM of Start to End
adding Inc each time
delay of Del MS each time thru the loop
*/

for(int i=Start;i<End;i = i + Inc)
{
analogWrite(S1_ENA_M_4, i); // Motor 4 enable
analogWrite(S1_ENB_M_2, i); // Motor 2 enable
analogWrite(S2_ENA_M_3, i); // Motor 3 enable
analogWrite(S2_ENB_M_1, i); // Motor 1 enable
delay(Del);
}

}

von dem Code habe ich schon einighes verstanden, weiss aber echt nicht was ich noch probieren könnte...

Rabenauge
14.06.2014, 20:36
Hm-"einiges" verstehen funktioniert bei sowas nicht.
Das klappt, wenn man Bausätze hat mit Herstellersupport-aber nich, für den halben üblichen Preis, aus China. ;)

-dein Anhang wird mir als "ungültig" angegeben vom Forum-da ist wohl was nich richtig.

Deine Pinbelegung mag funktionieren, aber besser lässt du die Pins ab 45 aufwärts FREI.
Ebenfalls 8 und 9 (wenn möglich).
Warum?
Da oben in der Gegend liegt die Hardware-SPI-Schnittstelle beim MEGA. Brauchst du momentan vermutlich nicht, aber besser frei halten-vielleicht willst sie mal nutzen, und dann musst wieder umbauen.
20 und 21 ebenfalls-das ist die I2C, und dir braucht man wirklich öfter, weils jede Menge Geräte gibt, die da klaglos (und: GEMEINSAM) anzuschlieesen gehn.

Was deinen Code angeht: ich krieche grade im Seeteufel: http://www.rc-modellbau-schiffe.de/wbb2/thread.php?threadid=28193 herum, Tisch voll, Kopf raucht, ich gucks mir an, aber kann ein, zwei Stunden dauern, ok?

- - - Aktualisiert - - -

Sodele. Bin mal über deinem Code und *grausen!! :rolleyes:
Lern mal programmieren-es hilft wirklich. ;)

Hab noch nicht alles sortiert ABER:

In der Hauptschleife rufst du die funktion vorwärts() auf.

die wiederum ruft die Rampe() auf- soweit, so gut. ABER: du gibst der, pro Durchlauf, 20 MILLISEKUNDEN. Also zwanzig tausendstel einer Sekunde-in der Zeit erhöht die den PWM-Wert jedesmal um 1.
Wie lange dauert es, bis diese Rampe durchlaufen ist, wenn wir nur 200 Werte haben?
Ungefähr 5 Sekunden.
Geh bitte mal nicht davon aus, dass die Motoren bei PWM-Werten unter, sagen wir, 20, überhaupt _irgendwas_ tun.
Das heisst, es ist _noch_ weniger.
Du erwartest also von deinem kleinen Roboter, dass er binnen, sagen wir, vier Sekunden aus dem Stand auf Vollgas beschleunigt, und das, obwohl er die halbe Zeit zu wenig Strom dafür bekommt. :cool:
Unter Last laufen die Motoren nämlich ziemlich sicher auch bei nem PWM-Wert von 20 noch nicht an!
Und selbst, wenn die das schaffen würden: die müssen auch noch die passende Drehzahl erreichen. Das aber können sie praktisch nie, weil sie nunmal weit träger sind als deine Rampe-die PWM läuft einfach davon.
Daher das Ruckeln unter Last: so gegen Ende hin, wenn dann die Motoren endlich genug Strom bekommen, _wollen_ sie loslaufen-dann aber ist die Rampe abgelaufen und nix gibts.

Aufgebockt gehts deutlich besser. Ohne Last drehn die Motoren einfach eher los.
Was kannst du tun?

Das einfachste ist es, das delay() mal zu verlängern. Wirst sehen, das hilft.
Zu Forschungszwecken würd _ich_ mal ne Ausgabe der aktuellen PWM auf die serielle Konsole geben, dann kannst du bequem gucken, ab welcher PWM sich überhaupt was tut an den Motoren, und in Zukunft nur noch diesen Bereich nutzen.
Im übrigen ist _dieses_ Programm mit den Rampen lediglich ne Demo, damit man erstmal sieht, wie das überhaupt funktioniert. Wenn man echte Beschleunigungsrampen programmieren will, muss mans nen bisschen anders angehen, auch, weil eben bei nem PWM-Wert von 1-10 sich nix tut.
Ich schreib dir mal ein kleines Programm, mit dem der Robbi nen Stück (da ich die Hardware nur von Bildern kenne, kann ich dir nicht sagen, wie weit, also pass auf!) vor und dann auch wieder zurück fahren sollte.
FAHREN-nicht nur im Stand mit den Rädchen wackeln.
Dauert paar Minuten...

- - - Aktualisiert - - -

Sodele.
Wenn du clever bist, findest du allein raus, was das Programm genau macht, BEVOR du es überträgst und startest.
Testen kann ichs nicht, aber es sollte funktionieren.
Sollte einer der Motoren falsch rum laufen, dann tausch die entsprechenden Pins aus (am Arduino meine ich)- das Programm kannst du später fein als Grundgerüst hernehmen.


/* ich habe deine, vorher angegebene Pinbelegung übernommen (sind nur andere Namen, weiter nix),
wenn du die Verkabelung änderst, musst du die entsprechenden Pin-Nummern bei den defines eintragen!
Die Variable "gasVorgabe" stellt die Motoren auf Halbgas, du kannst, indem du sie veränderst (zwischen
0 und 255) testen, ab wann der Roboter überhaupt los fährt, und auch, wie schnell er werden kann.
Drehen hab ich jetzt nicht eingebaut, da ich nicht weiss, welche Motornummer an welcher Stelle des
Roboters verbaut ist. */

#define M1aPin 52 // Motor1,Kabel a
#define M1bPin 50 // Motor1 Kabel b
#define M1GasPin 11 // PWM Motor1
#define M2aPin 48 // Motor2 Kabel a
#define M2bPin 46 // Motor2 Kabel b
#define M2GasPin 10 // PWM Motor2

#define M3aPin 53 // Motor3 Kabel a
#define M3bPin 51 // Motor3 Kabel b
#define M3GasPin 8 // Motor3 PWM
#define M4aPin 49 // Motor4 Kabel a
#define M4bPin 47 // Motor4 Kabel b
#define M4GasPin 9 // Motor4 PWM

int gasVorgabe=128; // hier legen wir fest, wie schnell die Motoren laufen, wenn du den Wert erhöhst
// laufen sie schneller, max. 255
void setup() // hier legen wir lediglich alle Motorenpins als Ausgänge fest und stellen sicher, dass die Motoren
{ // nicht einfach los laufen
pinMode(M1aPin, OUTPUT); //Motor1
pinMode(M1bPin,OUTPUT);
pinMode(M1GasPin,OUTPUT); //PWM Motor1
pinMode(M2aPin, OUTPUT); // Motor2
pinMode(M2bPin,OUTPUT);
pinMode(M2GasPin,OUTPUT); //PWM Motor2
pinMode(M3aPin, OUTPUT); //Motor3
pinMode(M3bPin,OUTPUT);
pinMode(M3GasPin,OUTPUT); // PWM Motor3
pinMode(M4aPin, OUTPUT); //Motor4
pinMode(M4bPin,OUTPUT);
pinMode(M4GasPin,OUTPUT);// PWM Motor4
analogWrite(M1GasPin,0);
analogWrite(M2GasPin,0);
analogWrite(M3GasPin,0);
analogWrite(M4GasPin,0);
delay(2000); // 2 Sekunden, um die Fingr vom Roboter zu nehmen, ehe.....
}

void vorwaerts() //******** vorwärts fahren für ungefähr 2 Sekunden ******************
{
//Motor_1 & 2 vorwärts
digitalWrite(M1aPin, LOW); // Motor1 Richtung festlegen
digitalWrite(M1bPin, HIGH);
digitalWrite(M2aPin, LOW); // Motor2 Richtung festlegen
digitalWrite(M2bPin, HIGH);
digitalWrite(M3aPin, LOW); // Motor3 Richtung festlegen
digitalWrite(M3bPin, HIGH);
digitalWrite(M4aPin, LOW); // Motor4 Richtung festlegen
digitalWrite(M4bPin, HIGH);
analogWrite(M1GasPin, gasVorgabe); //und hier schalten wir die PWM auf alle vier Motoren
analogWrite(M2GasPin,gasVorgabe);
analogWrite(M3GasPin,gasVorgabe);
analogWrite(M4GasPin,gasVorgabe);
delay(2000); // zwei Sekunden fahren,
analogWrite(M1GasPin,0); //Dann alle vier Motoren stoppen (schont die Getriebe ;) )
analogWrite(M2GasPin,0);
analogWrite(M3GasPin,0);
analogWrite(M4GasPin,0);
}
void rueckwaerts() //***Rückwärts gehts genauso, nur dass jeweils die A-undB-Pins "umgedreht" werden***
{
digitalWrite(M1aPin, HIGH); // Motor1 Richtung festlegen
digitalWrite(M1bPin, LOW);
digitalWrite(M2aPin, HIGH); // Motor2 Richtung festlegen
digitalWrite(M2bPin, LOW);
digitalWrite(M3aPin, HIGH); // Motor3 Richtung festlegen
digitalWrite(M3bPin, LOW);
digitalWrite(M4aPin, HIGH); // Motor4 Richtung festlegen
digitalWrite(M4bPin, LOW);
analogWrite(M1GasPin, gasVorgabe); //und hier schalten wir die PWM auf alle vier Motoren
analogWrite(M2GasPin,gasVorgabe);
analogWrite(M3GasPin,gasVorgabe);
analogWrite(M4GasPin,gasVorgabe);
delay(2000); // zwei Sekunden fahren,
analogWrite(M1GasPin,0); //Dann alle vier Motoren stoppen (schont die Getriebe ;) )
analogWrite(M2GasPin,0);
analogWrite(M3GasPin,0);
analogWrite(M4GasPin,0);
}


void loop() //******* das Hauptprogramm, in dem es rund geht... ***********
{
for (int i=0; i<3; i++) //machen wir das Ganze einfach dreimal...
{
vorwaerts();
delay(500); //halbe Sekunde warten, zum "bremsen"
rueckwaerts();
delay(500); // das selbe nochmal, damit wir nicht aus voller Fahrt rückwärts auf volle Fahrt vorwärts gehn
}
while(1); //stoppt das Programm, da stehende roboter leichter einzufangen sind ;)
}



Lies bitte die Kommentare im Programm auch und spiel mal mit der PWM-Variable etwas rum.
Aber Vorsicht: ich hab nicht die kleinste Ahnung, wie schnell das Ding werden kann, nich, dass dein Papa nachher ne neue Wohnungstüre von mir will. :strom

ahave
14.06.2014, 22:07
Hm-"einiges" verstehen funktioniert bei sowas nicht.am Anfang muss es so gehen - ich habe in den letzten 2 Wochen mehr über den arduino gelernt als ich für möglich gehalten hätte. Probieren geht doch manchmal über studieren...


-dein Anhang wird mir als "ungültig" angegeben vom Forum-da ist wohl was nich richtig.müsste jetzt gehen...


Lern mal programmieren-es hilft wirklich. ;)
das tue ich doch hier, oder?


Lies bitte die Kommentare im Programm auch und spiel mal mit der PWM-Variable etwas rum.
Aber Vorsicht: ich hab nicht die kleinste Ahnung, wie schnell das Ding werden kann, nich, dass dein Papa nachher ne neue Wohnungstüre von mir will. :strom
keine bange :-)

Deine Kommentare sind schon stark...

die nächsten 4 Tage hast Du ruhe von mir - bin unterwegs im Harz, kann also auch dein Rennautoprogramm nicht testen...

danke für die Hilfe...

Rabenauge
14.06.2014, 23:21
Na dann viel Spass-pack mal die Schneeschuhe ein, hier waren vorhin bloss noch neun Grad..;)

Und Ruhe: och, so lange du nicht zuuu anspruchsvoll wirst-so Kleinigkeiten mach ich gerne mal nebenbei. da gehnts voran. ;)

ahave
15.06.2014, 20:36
hi,
frage zu Deinem Motorshield - vielleicht kann ich daraus etwas auf die meinen ableiten...

Ich habe Gestern noch die Spannung am Eingang des Motorshields gemessen - 7,6V - die momentane Spannung des Accupacs. An den Motorklemmen - wenn der Motor lief - lagen nur 5V an. Ist es bei Deinem auch so? Warum wird nicht die volle Accuspannung genommen? Das müsste doch der Motor abkönnen oder?

Du hattest Recht - es ist kalt hier...

Rabenauge
15.06.2014, 23:02
Nö.
Meins reicht das durch, was reinkommt. Aber: deine Teilchen da sind völlig anders aufgebaut, also nicht wirklich vergleichbar, auch wenns die gleichen Treiber sind.
Möglicherweise sind die genau auf _diese_ Motoren zugeschnitten, und rücken deshalb nicht mehr raus, weil deine Minimotoren mehr eben nicht vertragen würden, bzw. dann das Plastikgetriebe auseinandernähmen?

Ausserdem: _wann_ hast du gemessen?
Hoffentlich nich, während das Testprogramm von mir lief, unverändert?
Dann ist die Sache klar: ich hab die Gas-Variable nur auf 128 gestellt (damits dein Botchen nicht gleich zerlegt, hab keine Ahnung, was der bei Vollgas macht), also nur halbe Leistung. Wenn du mal nachdenkst, wie eine PWM-Motorregelung funktioniert, ist klar, dass du in der Summe nicht die volle Spannung an den Motoren haben konntest...um da die Spannung, die wirklich kommt (die Treiber schalten nur immer ein und aus) zu messen, müsstest du schon nen Oszilloskop haben.