pinMode is inderdaad niet nodig voor analogWrite() maar wel best practice. Ook zorgt dit ervoor dat de pin gelijk laag getrokken wordt bij het opstarten en niet pas in de eerste keer dat de loop doorlopen wordt. Maar aangezien de bootloader toch even tijd inneemt met opstarten zijn de pull downs net zo makkelijk.
Ga je een situatie maken waarin left en right tegelijk true zijn?
@Timo, wat is de reden dat de elco na de 78xx niet te groot mag zijn? Ik wil ook graag nog wat leren.
twee redenen, eerste is de laadstroom die de 78xx dan moet verwerken maar waar ze (als ik me goed herinner) ook voor waarschuwen in de handleiding is dat hij instabiel kan worden. Dus beter zware elco's voor de 78xx (kan hij ook meer lading opslaan) en dan alleen een kleine als ontstoring.
/*****************************************************************************versie met potmeters voor links/stop/rechts, minimum en maximum snelheid.*****************************************************************************/// libraries#include <Wire.h> #include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment display = Adafruit_7segment();const int PwmDl1 = 9; // Dl1 TA8050 H-bridge leftconst int PwmDl2 = 10; // Dl2 TA8050 H-bridge rightconst int SpeedP = 0; // speed potentiometerconst int MinPot = 1; // minimum speed potentiometerconst int MaxPot = 2; // maximum speed potentiometerconst int ButMin = 0; // button minimum speedconst int ButMax = 1; // button maximum speedbool left = false;bool right = false;int minSpeed = 0;int maxSpeed = 255;float factor = 1.0;/****************************************************************************/void setup() { // set display display.begin(0x70); display.setBrightness(7); // 0..15 // set PWM frequency timer 1 to 31,25 kHz. TCCR1B = TCCR1B & 0b11111000 | 0x01; // set input pins pinMode(ButMin, INPUT_PULLUP); pinMode(ButMax, INPUT_PULLUP);}/****************************************************************************/void loop() { int value = analogRead(SpeedP) / 2; // read speedP: 0..511 int cycle = 0; // value: 0..249 = left, 250..260 = deadband, 261..511 = right value < 250 ? left = true: left = false; value > 260 ? right = true: right = false; if (left) { // duty cycle between minspeed - maxspeed cycle = minSpeed + int((249.0 - value) * factor); analogWrite(PwmDl2, 0); analogWrite(PwmDl1, cycle); // write duty cycle to PWM PwmDL1 } if (right) { // duty cycle between minSpeed - maxSpeed cycle = minSpeed + int((value - 261.0) * factor); analogWrite(PwmDl1, 0); analogWrite(PwmDl2, cycle); // write duty cycle to PWM PwmDL2 } if (!left && !right) { analogWrite(PwmDl1, 0); analogWrite(PwmDl2, 0); if (digitalRead(ButMin) == 0) { cycle = minSpeed = analogRead(MinPot) / 4; // 0..255 factor = (maxSpeed - minSpeed) / 250.0; } if (digitalRead(ButMax) == 0) { cycle = maxSpeed = analogRead(MaxPot) / 4; // minSpeed..255 factor = (maxSpeed - minSpeed) / 250.0; } } display.println(cycle); display.writeDisplay(); }/****************************************************************************/