PWM werkt niet bij 1 motor in zijn achteruit...
8 berichten
• Pagina 1 van 1
PWM werkt niet bij 1 motor in zijn achteruit...
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
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
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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.
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
shooter@home.nl
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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.
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.
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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.
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
shooter@home.nl
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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...
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
Met deze pinnen werkt het.
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...
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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.
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.
Re: PWM werkt niet bij 1 motor in zijn achteruit...
Op een UNO zijn pinnen 3,5,6,9,10 en 11 pwm pinnen, de rest niet
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: PWM werkt niet bij 1 motor in zijn achteruit...
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.
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.
8 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten