PWM werkt niet bij 1 motor in zijn achteruit...

IDE gerelateerde berichten
Berichten: 10
Geregistreerd: 13 Dec 2015, 14:19

PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor Kobusking » 20 Dec 2015, 23:58

Hallo,
Ik ben erg nieuw in Arduino land en bezig met mijn eigen 'robotje'.
Nu heb ik de standaard codes een beetje gehad en ben ik bezig met een andere benadering van de verschillende taken die hij zou moeten uitvoeren.
Maar al snel gaat het niet goed.
Ik wil de snelheid kunnen controleren door de snelheid in te kunnen stellen.
Ik gebruik een originele UNO en een motorshield L298N.

Voor de linker motor werkt het allemaal erg goed (aangesloten op in3 en in4) de motor op in1 & in2 staat alleen aan of uit..
Volgens de beschrijving moeten de zwarte draden in in2 & in3.
Bij het gebruik van de motor branden de lampjes in2 (zwart) & in4 (rood).
Dit lijkt me tegenstrijdig en kan dit de oorzaak zijn van het probleem?
Ik heb al heel wat geprobeerd, maar ontbeer de kennis..

btw de code mbt de bochten moet nog worden aangepast, dus mag even buiten beschouwing gelaten worden, net als alle andere functies..
Alvast bedankt voor de hulp.

cpp code
#include <NewPing.h>
#include <Servo.h>

//define servo's
Servo servo1;
Servo servo2;

//set sonar
#define TRIGGER_PIN 5
#define ECHO_PIN 6
#define MAX_DISTANCE 200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

//set motorPins
int in1 = 9, in2 = 8, in3 = 11, in4 = 12; //pwm for in1 & in3
int leftDistance, rightDistance;

void setup() {
//set servo_1
servo1.attach(3, 705, 2630);
servo1.write(90); //set servo to the middle of the robot
// set servo_2
servo2.attach(4, 810, 2500);
servo2.write(90); //set servo to the front of the robot

// setup motorPins to output
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);

delay(4000); //gives time to put down the robot before it will drive

Serial.begin(115200);
}

void loop() {
// put your main code here, to run repeatedly:
vooruit(2000, 200); //2 seconden op speed 200 van 255
remmen(2000);
achteruit(2000, 255);
remmen(2000);
//rechtsaf(1000, 200, 128);
//remmen(2000);
//rechtsaf_a(1000, 128, 200);
//remmen(2000);
//linksaf(1000, 128, 200);
//remmen(2000);
//linksaf_a(1000, 200, 128);
//remmen(2000);
}

//motorcontrol L298N
void robotMove(int l1, int l2, int r1, int r2)
{
analogWrite(in1, l1);
digitalWrite(in2, l2);
analogWrite(in3, r1);
digitalWrite(in4, r2);
}

void vooruit(int wait, int vSpeed) {
//vooruit
Serial.println("Vooruit");
robotMove(255-vSpeed, HIGH, 255-vSpeed, HIGH);
delay(wait);
}

void rechtsaf(int wait, int lSpeed, int rSpeed) {
//rechtsaf
Serial.println("Rechtsaf vooruit");
robotMove(lSpeed, LOW, rSpeed, LOW);
delay(wait);
}

void rechtsaf_a( int wait, int lSpeed, int rSpeed) {
//rechterbocht achteruit
Serial.println("Rechtsaf achteruit");
robotMove(255-lSpeed, HIGH, 255-rSpeed, HIGH);
delay(wait);
}

void linksaf(int wait, int lSpeed, int rSpeed) {
Serial.println("Linksaf vooruit");
robotMove(lSpeed, LOW, rSpeed, LOW);
delay(wait);
}

void linksaf_a( int wait, int lSpeed, int rSpeed) {
//linkerbocht achteruit
Serial.println("Linksaf achteruit");
robotMove(255-lSpeed, HIGH, 255-rSpeed, HIGH);
delay(wait);
}

void achteruit(int wait, int vSpeed){
Serial.println("Achteruit");
robotMove(vSpeed, LOW, vSpeed, LOW); // when reversing, the speed needs to be opposite, so subtract from 255
delay(wait);
}

void remmen(int wait){
Serial.println("Remmen");
robotMove(0, LOW, 0, LOW);
delay(wait);
}

void compareDistance(int wait) {
if (leftDistance>rightDistance){
linksaf(2000, 255, 80);
delay(wait);
}
else if (leftDistance<rightDistance){
rechtsaf(2000, 80, 255);
delay(wait);
}
else {
achteruit(2000, 255);
}
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor shooter » 21 Dec 2015, 11:26

tja, ik weet natuurlijk niet zeker hoe de shield werkt, maar:
in1 is vooruit motor1
in2 is achteruit motor1
maak een foto van je shield of zoek op welke pinnen de shield gebruikt wordt.
dat verschilt per versie.
sommige gebruiken 9,10,11,12 dus even nakijken of je de goede pinnen hebt.


je commentaar is echter anders als je programma.
paul deelen
shooter@home.nl

Berichten: 10
Geregistreerd: 13 Dec 2015, 14:19

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor Kobusking » 21 Dec 2015, 15:43

Bedankt voor je reactie, dat nog niet alle commentaren kloppen, klopt. het geheel moet nog aangepast worden.
Door alle wijzigingen zijn er wat dingen overhoop gegooid en moeten nog verder nagelopen worden. Maar eerst dit even regelen.
Ik heb hier een paar afbeeldingen van mijn motor-controler en mijn sensor-shield op de UNO.
Ik hoop dat je er iets van kunt af leiden.
Afbeelding

Afbeelding

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor shooter » 21 Dec 2015, 22:05

ik kan zo snel geen fout vinden, bedrading lijkt goed, en je programma afgezien van vooruit is HIGH lijkt mij ook goed hoor.
verder is het handiger als je voor de motoren (ook de servos een aparte batterij gebruikt) want dat trekt veel stroom.
en de uno ook een 9Volt batterij. later ga je toch accus gebruiken.

wel mooie oplossing met die tijden in een soort programma, later leer je nog wel om delay niet te gebruiken, en je stuurcommando's in een array.
paul deelen
shooter@home.nl

Berichten: 10
Geregistreerd: 13 Dec 2015, 14:19

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor Kobusking » 22 Dec 2015, 10:55

Bedankt voor je reactie Shooter, alle tips zijn welkom, dit is tenslotte mijn eerste kennismaking met Arduino.
De delay zit er nu in om vooral tijd te hebben om te bekijken wat er gebeurt en dat er niet een hele serie achter elkaar uitgevoerd wordt zonder dat ik bij kan houden of hij doet wat ik verwacht... :D

Pinnen omgooien blijkt te helpen. Wel raar want alle pinnen hebben PWM net als de pinnen die ik nu gebruik..
Vreemd, maar het werkt, dus vinden we het voor nu ok. Hoewel.... Als iemand dit kan verklaren snap ik misschien wat ik doe :oops:
Met deze pinnen werkt het.

Code: Alles selecteren
#include <NewPing.h>
#include <Servo.h>

//define servo's
Servo servo1;
Servo servo2;

//set sonar
#define TRIGGER_PIN 4
#define ECHO_PIN 5
#define MAX_DISTANCE 200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

//set motorPins
int in1 = 6, in2 = 7, in3 = 11, in4 = 12; //pwm for in1 & in3
int leftDistance, rightDistance;

void setup() {
 //set servo_1
  servo1.attach(2, 705, 2630);
  servo1.write(90); //set servo to the middle of the robot
 // set servo_2
  servo2.attach(3, 810, 2500);
  servo2.write(90); //set servo to the front of the robot

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor nicoverduin » 22 Dec 2015, 11:44

Dat klopt. Zie volgende artikel : http://rcarduino.blogspot.nl/2012/01/ca ... -with.html
Timer1 wordt gebruikt door de servo waardoor de pwm op pinnen 9 en 10 komt te vervallen. Tegelijkertijd kun je wel meer servo's gebruiken via software matige aansturing.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor MarcelK » 22 Dec 2015, 21:10

Op een UNO zijn pinnen 3,5,6,9,10 en 11 pwm pinnen, de rest niet

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: PWM werkt niet bij 1 motor in zijn achteruit...

Berichtdoor nicoverduin » 22 Dec 2015, 21:23

De servo library gebruikt zijn eigen algoritmes via een timer om meerdere PWMs te maken. Uiteindelijk is een PWM niet meer dan een pulsgenerator met een variabele duty cycle (verhouding deel hoog tov. de hele puls duur) waarbij 4 op een 8 bit timers draaien en op rond de 490 Hz draaien. De andere 2 draaien op de 16 bit timer (pins 9 en 10). Deze draait dan op rond de 960 Hz. Echter diezelfde 16 bit timer is in gebruik door de Servo library waardoor deze pinnen niet meer als PWM zijn te gebruiken.
Maar een variabele duty cycle generator kun je natuurlijk ook zelf schrijven met een timer. En dat is nu net wat de servo library doet.
Daarop aanvullend heb je van die 32 kanaals servo controllers. Die gebruiken een STM32F103 processors (lees klein 32 bits processortje). Die heeft echt geen 32 PMW poort hoor, maar is snel genoeg (80Mhz) en groot genoeg (128KB) flash geheugen om 32 PWM kanalen te sturen. Puur software matig.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten