Ah, dit zou kunnen. Maar dan een vraag van mij. 50Hz en 100Hz zijn geen standaard frequenties op de Arduino. Hiervoor moet je de resolutie al aanpassen (= verkleinen). Ook blijf je spreken van procenten dus ik neem aan dat je in die library de snelheid in procenten op geeft? Als dat zo is zou ik je willen vragen eens te testen zonder die library. Je snijdt jezelf namelijk al in de vingers als je voor een 0-100 bereik kiest ipv 0-255. Helemaal omdat het intern toch gemapt zal worden naar iets dat geen 0-100 bereik heeft. Zo krijg je een aardige onnauwkeurigheid in je stappen. Zo kan dus een aantal stappen groter zijn dan andere, iets dat voor een mooi soepen rijgedrag niet helpt.
Wil je dus een lage frequentie gebruiken zou ik eens kijken naar de 123Hz. Hierop zie je LEDverlichting niet meer knipperen en is een dus nog laag te noemen. Vervolgens kan je gewoon rijden met analogWrite() met een waarde tussen 0-255. En ja, 0-100 bereik klinkt lekker makkelijk voor ons als mensen maar ik zou toch proberen te gaan voor wat natuurlijk is voor een Arduino en dat is 8-bit.
Wat ik nu aan Max adviseer is dus precies wat ik zelf probeer te vermijden.
/****************************************************************************/#include <Wire.h> // display libraries#include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment display = Adafruit_7segment();#define port1 9 // DL1 TA8050 H-bridge#define port2 10 // DL2 TA8050 H-bridgeint value; int cycle;bool left = false;bool right = false;/****************************************************************************/void setup() { pinMode(port1, OUTPUT); pinMode(port2, OUTPUT); // set PWM frequency timer 1 to 122 Hz // base frequency 31250 / 256 = 122 Hz TCCR1B = TCCR1B & 0b11111000 | 0x04; // set timer 1 divisor 256 analogWrite(port1, 0); analogWrite(port2, 0); display.begin(0x70); // set display display.setBrightness(7); // 0..15 } // end setup/****************************************************************************/void loop() { // main loop value = analogRead(0) / 2; // read pot.: 0..511 cycle = 0; // value: 0..249 = left, 250..260 = deadband, 261..511 = right if (value < 250) left = true; else left = false; if (value > 260) right = true; else right = false; if (left) { // write duty cycle to PWM port1 cycle = 255 - value; // duty cycle between 5..255 analogWrite(port2, 0); analogWrite(port1, cycle); } if (right) { // write duty cycle to PWM port2 cycle = value - 256; // duty cycle between 5..255 analogWrite(port1, 0); analogWrite(port2, cycle); } if (!left && !right) { analogWrite(port1, 0); analogWrite(port2, 0); } // cycle: 255 (left) - 0 - 255 (right) display.println(cycle); // duty cycle to display display.writeDisplay(); } // end loop/****************************************************************************/
#define port1 9 // DL1 TA8050 H-bridge#define port2 10 // DL2 TA8050 H-bridge
const unsigned int PwmDL1 = 9 // DL1 TA8050 H-bridgeconst unsigned int PwmDL2 = 10 // DL2 TA8050 H-bridge
void loop() { // main loop int speed; speed = map(analogRead(SpeedKnob), 0, 1023, -255, 255); //map the SpeedKnob value to a speed between -255 (left) and 255 (right) if(speed <= 5 && speed >=-5){ //5 point deadband around 0 analogWrite(PwmDL1, 0); analogWrite(PwmDL2, 0); } else if(speed < 0){ //so turn left, deadband excluded analogWrite(PwmDL2, 0); analogWrite(PwmDL1, -speed); //analogWrite expects a positive value, double negative is positive again } else{ //or it's right analogWrite(PwmDL1, 0); analogWrite(PwmDL2, speed); } display.println(cycle); // duty cycle to display display.writeDisplay();}
Nog een vraagje. Hoe heb je die minimale snelheden bepaald? Door steeds de snelheid met een stapje te verhogen tot de loc in beweging komt? Zo ja, dan kan je nog eens testen of de loc daarna misschien nog een stapje omlaag kan zonder tot stilstand te komen.
if( a == b){ c = HIGH;}else{ c = LOW;}
(a == b ? c = HIGH : c = LOW);
c = (a == b ? HIGH : LOW);
/***************************************************************************** kale versie met potmeter: links - stop - rechts*****************************************************************************/const int PwmDl1 = 9; // Dl1 TA8050 H-bridge leftconst int PwmDl2 = 10; // Dl2 TA8050 H-bridge rightbool left = false;bool right = false;/****************************************************************************/void setup() { // set PWM frequency timer 1 to 31,25 kHz. TCCR1B = TCCR1B & 0b11111000 | 0x01; }/****************************************************************************/void loop() { int value = analogRead(0) / 2; // read potentiometer: 0..511 int cycle = 0; delay(100); // value: 0..249 = left, 250..260 = deadband, 261..511 = right if (value < 250) left = true; else left = false; if (value > 260) right = true; else right = false; if (left) { // write duty cycle to PWM PwmDL1 cycle = 255 - value; // duty cycle between 5..255 analogWrite(PwmDl2, 0); analogWrite(PwmDl1, cycle); } if (right) { // write duty cycle to PWM PwmDL2 cycle = value - 256; // duty cycle between 5..255 analogWrite(PwmDl1, 0); analogWrite(PwmDl2, cycle); } if (!left && !right) { analogWrite(PwmDl1, 0); analogWrite(PwmDl2, 0); } }/****************************************************************************/
De getekende schakelaar is ’n drie standen exemplaar maar met ’n twee standen werkt ’t ook.
In alternatieve schema’s waarin de TA 8050 wordt gebruikt ontbreken de twee weerstanden R1 en R2. Weglaten kan leiden tot een onbepaald gedrag bij het opstarten of resetten van de Arduino, dwz de loc rijdt even op topsnelheid in willekeurige richting weg. Ietwat slordig…
In plaats van een Arduino Uno kunnen ook andere Arduino’s gebruikt worden. Een goed alternatief lijkt de Arduino Pro Mini 5v. In dat geval zal de spanningsregelaar hoe dan ook moeten worden gebruikt.
Wat betreft de code, mooi simpel voorbeeldje. Maar ontbreekt eigenlijk de nette pinMode() declaratie.
Ook heeft de input van de potmeter geen mooie toegankelijke naam gekregen
En de if, if, if constructie kan je vervangen door een if, else if, else if constructie. Voor hier niet echt van toepassing maar scheelt de Arduino weer checks :p
Veel plezier met knutselen!
en dat terwijl ik in de Arduino handleiding lees dat dat voor een eenvoudige analogWrite niet nodig is...
Dat komt omdat ik deze constructie nodig heb voor nog aan te brengen toeters en bellen - ik weet 't: zwak excuus...