Upgrade Kids-Car
22 berichten
• Pagina 1 van 3 • 1, 2, 3
Upgrade Kids-Car
Hoi allemaal,
Ik was aan het zoeken voor Info en Kwam dit forum tegen,
na een beetje rond gesnuffeld te hebben
lijkt me dit wel een gezellig hoekje van het Inet
en heb ik maar besloten om mij hier aan te melden.
Maar dat terzijde, Mijn project........
Ik heb voor mijn kinderen een elektrisch autotje.
Ik vertrouw ze nog niet om er helemaal alleen mee te laten rijden ( 2 en 4 Jaar).
Dus heb er een RC afstandsbediening op gemaakt.
Een ESC voor het stuur, geen servo wil dat de kids zelf sturen
maar dat ik kan ingrijpen als het nodig is, een servo gaat weer terug naar de middenstand
als ik de knop los laat daarom een ESC. Dit wil ik ook zo laten.
Het "gas" werkt ook via een ESC, maar heb een reed-relais in de signaal draad zitten.
Deze kan ik schakelen via het 3e kanaal van de zender.
NC is de RC ontvanger
NO is de lokale besturing. (Gemaakt uit een servo tester)
(zender uit of buiten bereik auto rijd niet )
Dit werkt op zich wel goed, maar wil het wat mooier maken.
Het is nu zo dat het "gaspedaal" nog telkens een schakelaar is
en de kinderen een potje op het dashboard hebben om de snelheid te regelen.
Dit wil ik ombouwen naar een variabel pedaal.
Hier voor heb ik een simpel en goedkoop pedaaltje gevonden op Ebay
die werkt met een HAL-sensor
0% 0,8V - 100% 4,2V
Dit moet omgezet worden naar een servo signaal,
Hier voor heb ik nog wel een arduino nano liggen.
Het pedaal sluit ik aan op A0 van de arduino,
een schakelaar op D3 voor voor en achteruit.
D2 is de uitgang naar de ESC (om te testen een servo)
Dit werkt allemaal mooi.
Maar wil eigenlijk ook gelijk het Reed-relais er uit gooien,
ik vind het een beentje een mokerslag oplossing.
Maar hier begint mijn Probleem
Dus zat te denken maak er een pass-through in de code.
Hier in loop ik dus vast, en vraag om hulp.
Ik heb hier voor " digitalWrite(2, digitalRead(4)); " gebruikt
Ik heb ook een in en output maar de servo(ESC) is heel onrustig
en reageert een beetje vaag.
Als ik kijk op de scope het ik een zo goed als gelijk beeld......
(als bijlage screenshot, Input groen en output geel)
Hebben jullie nog een Idee ?
Of doe ik iets verkeert?
Alvast dank voor de hulp.
Hier de complete code die ik gebruikt heb.
cpp code
Ik was aan het zoeken voor Info en Kwam dit forum tegen,
na een beetje rond gesnuffeld te hebben
lijkt me dit wel een gezellig hoekje van het Inet
en heb ik maar besloten om mij hier aan te melden.
Maar dat terzijde, Mijn project........
Ik heb voor mijn kinderen een elektrisch autotje.
Ik vertrouw ze nog niet om er helemaal alleen mee te laten rijden ( 2 en 4 Jaar).
Dus heb er een RC afstandsbediening op gemaakt.
Een ESC voor het stuur, geen servo wil dat de kids zelf sturen
maar dat ik kan ingrijpen als het nodig is, een servo gaat weer terug naar de middenstand
als ik de knop los laat daarom een ESC. Dit wil ik ook zo laten.
Het "gas" werkt ook via een ESC, maar heb een reed-relais in de signaal draad zitten.
Deze kan ik schakelen via het 3e kanaal van de zender.
NC is de RC ontvanger
NO is de lokale besturing. (Gemaakt uit een servo tester)
(zender uit of buiten bereik auto rijd niet )
Dit werkt op zich wel goed, maar wil het wat mooier maken.
Het is nu zo dat het "gaspedaal" nog telkens een schakelaar is
en de kinderen een potje op het dashboard hebben om de snelheid te regelen.
Dit wil ik ombouwen naar een variabel pedaal.
Hier voor heb ik een simpel en goedkoop pedaaltje gevonden op Ebay
die werkt met een HAL-sensor
0% 0,8V - 100% 4,2V
Dit moet omgezet worden naar een servo signaal,
Hier voor heb ik nog wel een arduino nano liggen.
Het pedaal sluit ik aan op A0 van de arduino,
een schakelaar op D3 voor voor en achteruit.
D2 is de uitgang naar de ESC (om te testen een servo)
Dit werkt allemaal mooi.
Maar wil eigenlijk ook gelijk het Reed-relais er uit gooien,
ik vind het een beentje een mokerslag oplossing.
Maar hier begint mijn Probleem
Dus zat te denken maak er een pass-through in de code.
Hier in loop ik dus vast, en vraag om hulp.
Ik heb hier voor " digitalWrite(2, digitalRead(4)); " gebruikt
Ik heb ook een in en output maar de servo(ESC) is heel onrustig
en reageert een beetje vaag.
Als ik kijk op de scope het ik een zo goed als gelijk beeld......
(als bijlage screenshot, Input groen en output geel)
Hebben jullie nog een Idee ?
Of doe ik iets verkeert?
Alvast dank voor de hulp.
Hier de complete code die ik gebruikt heb.
cpp code
#include <Servo.h>
Servo esc; // create servo object to control a RC-ESC
const int buttonPin1 = 5; // Switch from remote to foot throttle (for now, it wil be a servo singal)
const int buttonPin2 = 3; // Switch from forward to backward
int potpin = 0; // analog pin used to connect the Foot Throttle (0% = 0.8v 100% = 4.2v)
int val; // variable to read the value from the analog pin
int buttonState1 = 0; // variable for reading the pushbutton 1 status
int buttonState2 = 0; // variable for reading the pushbutton 2 status
int servoin = 4; // Remote servo-Singal input from RC-reciever
int servoswitch = 9; // Switch singal remote or foot throttle
void setup() {
esc.attach(2); // attaches the servo on pin 3 to the servo object
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(servoin, INPUT);
Serial.begin(9600); // Just for calibration and debug
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
if (buttonState1 == HIGH)
// Remote
{
digitalWrite(2, digitalRead(4));
}
else
// Foot throttle
{
if (buttonState2 == HIGH) // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
//Backward
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)(0,8v=164 and 4,2v = 859)
val = map(val, 164, 859, 90, 0); // scale it to use it with the servo (value between 0 and 180)
esc.write(val); // sets the servo position according to the scaled value
}
else
//Forward
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)(0,8v=164 and 4,2v = 859)
val = map(val, 164, 859, 90, 180); // scale it to use it with the servo (value between 0 and 180)
esc.write(val); // sets the servo position according to the scaled value
}
//just for calibration and debug
int sensorValue = analogRead(A0); // read the input on analog pin 0:
float voltage = sensorValue * (5.0 / 1023.0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
Serial.print(sensorValue); // print out the ADC value you read:
Serial.print(" ");
Serial.print(voltage); // print out the voltage value you read:
Serial.print(" ");
Serial.println(val); // print out the servo value you read:
}
}
- Bijlagen
-
- Scope.jpg (172.32 KiB) 10927 keer bekeken
Advertisement
Re: Upgrade Kids-Car
Het is me niet helemaal duidelijk.
Zal ik gewoon schrijven wat in me opborrelt ? dan kijk jij maar wat je er mee doet.
1 )
De voorkeur heeft: const int potpin = A0;
Dus label "A0" voor analoge pin "A0" en een pin bij voorkeur met "const".
2 )
Een "digitalWrite(2, digitalRead(4));" kun je vergeten voor een servo signaal.
Het is een mooi scope plaatje maar in de praktijk werkt zo iets niet.
Een Arduino Nano kan een digitale ingang lezen of een uitgang schrijven in 0.125 µs, maar de Arduino digitalWrite() functie duurt 5 µs. Ja, dat is inderdaad 40 (veertig) keer langzamer
Volgens mij is er een library die een servo signaal kan lezen. Ik ben vergeten hoe die heet
Ik kan wel code vinden met interrupts en micros() of met pulseIn(), maar ik een goede library kan ik niet vinden.
3 )
Je hebt nog geen eigen stijl voor de tekst layout van de sketch. Kun je heel je sketch op een nette manier opmaken ? Dus overal het inspringen en de haakjes op dezelfde manier.
4 )
Het is handiger om de variabelen zo lokaal mogelijk te declareren.
Bijvoorbeeld bovenin de loop(): int buttonState1 = digitalRead(buttonPin1);
En misschien zelfs binnen het if-statement: int val = analogRead(potpin);
5 )
Wat is dit: esc.attach(2); // attaches the servo on pin 3 to the servo object
Is het nu pin 2 of pin 3. Dit lijkt misschien alsof ik muggen aan het ziften ben, maar ik vind een duidelijke sketch belangrijk.
Kun je een pin nummer toevoegen ? const int servoOutPin = 2;
6 )
Dus je gebruikt de Servo library ook echt, want je doet een attach met pin 2, en vervolgens ga je een digitalWrite() doen naar dezelfde pin 2. Dat kan natuurlijk niet. Ofwel de Servo library maakt het signaal, ofwel je zet zelf de pin met digitalWrite.
Zal ik gewoon schrijven wat in me opborrelt ? dan kijk jij maar wat je er mee doet.
1 )
De voorkeur heeft: const int potpin = A0;
Dus label "A0" voor analoge pin "A0" en een pin bij voorkeur met "const".
2 )
Een "digitalWrite(2, digitalRead(4));" kun je vergeten voor een servo signaal.
Het is een mooi scope plaatje maar in de praktijk werkt zo iets niet.
Een Arduino Nano kan een digitale ingang lezen of een uitgang schrijven in 0.125 µs, maar de Arduino digitalWrite() functie duurt 5 µs. Ja, dat is inderdaad 40 (veertig) keer langzamer
Volgens mij is er een library die een servo signaal kan lezen. Ik ben vergeten hoe die heet
Ik kan wel code vinden met interrupts en micros() of met pulseIn(), maar ik een goede library kan ik niet vinden.
3 )
Je hebt nog geen eigen stijl voor de tekst layout van de sketch. Kun je heel je sketch op een nette manier opmaken ? Dus overal het inspringen en de haakjes op dezelfde manier.
4 )
Het is handiger om de variabelen zo lokaal mogelijk te declareren.
Bijvoorbeeld bovenin de loop(): int buttonState1 = digitalRead(buttonPin1);
En misschien zelfs binnen het if-statement: int val = analogRead(potpin);
5 )
Wat is dit: esc.attach(2); // attaches the servo on pin 3 to the servo object
Is het nu pin 2 of pin 3. Dit lijkt misschien alsof ik muggen aan het ziften ben, maar ik vind een duidelijke sketch belangrijk.
Kun je een pin nummer toevoegen ? const int servoOutPin = 2;
6 )
Dus je gebruikt de Servo library ook echt, want je doet een attach met pin 2, en vervolgens ga je een digitalWrite() doen naar dezelfde pin 2. Dat kan natuurlijk niet. Ofwel de Servo library maakt het signaal, ofwel je zet zelf de pin met digitalWrite.
Re: Upgrade Kids-Car
Deze code is uit kopieer en plak werk opgebouwd en met aantal aanpassingen er tussen door, en ja zitten ook nog zat foutjes in.
Programmeren is ook niet mijn sterkste kant......
Punt 1 : aangepast, en ja je hebt gelijk (wist het wel niet maar aan gedacht)
Punt 2 : was ik al achter, hier voor zoek ik dus een nette pass-through oplossing
met een nette servo-signaal gestuurd if / else (of soort gelijk) (wat nu door een schakelaar op D5 gedaan word)
Ik heb Library`s gezien over RC signalen maar dat gaat dan vaak over PPM, het signaal tussen zender en ontvanger,
en ik wil werken vanaf de ontvanger.
Ik kwam tijdens het maken van dit bericht het dit nog tegen,
misschien dat ik hier delen van kan gebruiken
Punt 3 : Heb je helemaal gelijk in, dit is dan ook kopieer en plak werk, maar zal er mee bezig gaan en er in de toekomst om denken.
Punt 4 : wist ik niet, ik dacht dat al die zaken bovenin moesten staan.
Punt 5 : Typo nog een overblijfsel van dat gekopieer en geplak.
Punt 6 : was ik al bang voor, denk ook dat dit met punt 2 te maken heeft
Mijn doel is naast het omzetten van een 0,8v -4,2 volt signaal (wat goed werkt)
dat ik de kan kiezen op de afstandsbediening hoe ik de motor`s van de auto aanstuur,
of via de gashandel van de afstandsbediening of via het voetpedaal in de auto.
Wat ik nu dus doe met een door het 3e kanaal gestuurd reed-relais.
Programmeren is ook niet mijn sterkste kant......
Punt 1 : aangepast, en ja je hebt gelijk (wist het wel niet maar aan gedacht)
Punt 2 : was ik al achter, hier voor zoek ik dus een nette pass-through oplossing
met een nette servo-signaal gestuurd if / else (of soort gelijk) (wat nu door een schakelaar op D5 gedaan word)
Ik heb Library`s gezien over RC signalen maar dat gaat dan vaak over PPM, het signaal tussen zender en ontvanger,
en ik wil werken vanaf de ontvanger.
Ik kwam tijdens het maken van dit bericht het dit nog tegen,
misschien dat ik hier delen van kan gebruiken
Punt 3 : Heb je helemaal gelijk in, dit is dan ook kopieer en plak werk, maar zal er mee bezig gaan en er in de toekomst om denken.
Punt 4 : wist ik niet, ik dacht dat al die zaken bovenin moesten staan.
Punt 5 : Typo nog een overblijfsel van dat gekopieer en geplak.
Punt 6 : was ik al bang voor, denk ook dat dit met punt 2 te maken heeft
Mijn doel is naast het omzetten van een 0,8v -4,2 volt signaal (wat goed werkt)
dat ik de kan kiezen op de afstandsbediening hoe ik de motor`s van de auto aanstuur,
of via de gashandel van de afstandsbediening of via het voetpedaal in de auto.
Wat ik nu dus doe met een door het 3e kanaal gestuurd reed-relais.
Re: Upgrade Kids-Car
Die link is met een interrupt. Dat lijkt me de beste manier. Ik heb met "Bibliotheek beheer" en op github.com niet iets kunnen vinden dat ik meende te herkennen. Sorry
Re: Upgrade Kids-Car
Ok dan zal ik eens kijken hoe dat van de link in elkaar steekt.
Daar heb je een servo signaal die bewerkt word en door gestuurd word naar de servo,
dan moet het ook kunnen zonder het te bewerken lijkt me .
In ieder al bedenkt voor het kijken.
Daar heb je een servo signaal die bewerkt word en door gestuurd word naar de servo,
dan moet het ook kunnen zonder het te bewerken lijkt me .
In ieder al bedenkt voor het kijken.
Re: Upgrade Kids-Car
pass through zou ik met een relais wisselcontact doen, eventueel 2 relais naast elkaar.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Upgrade Kids-Car
Dat is inderdaad de kortste klap, die zit er toch al in.
Een 2 pool, wissel reed-relais ivm de korte overschakel tijd
(een Coto Technology 7000 Reed Relay : Operate Time - including bounce 1.0 msec - Release Time 0.1 msec)
aangestuurd door een RC relais printje van Conrad, dit werkt wel goed.
En de arduino alleen gebruiken om het pedaal signaal om te zetten
naar een servo signaal.
Een 2 pool, wissel reed-relais ivm de korte overschakel tijd
(een Coto Technology 7000 Reed Relay : Operate Time - including bounce 1.0 msec - Release Time 0.1 msec)
aangestuurd door een RC relais printje van Conrad, dit werkt wel goed.
En de arduino alleen gebruiken om het pedaal signaal om te zetten
naar een servo signaal.
Re: Upgrade Kids-Car
Ondertussen was ik zelf aan de slag gegaan. Ik heb geen griep en ik heb niet gezopen, maar ik kwam er niet uit.
Wat hieronder staat werkt trouwens wel.
De signaalgever voor een ander Arduino board zit er ook bij (tussen commentaar).
Het idee is overal hetzelfde. Maak een interrupt met CHANGE, en bereken met micros() de pulsebreedte en lees in de interrupt routine met digitalRead() of het signaal omhoog of omlaag was gegaan.
Vanaf dat moment ging het bij mij mis, de digitalRead() wilde niet, en de waarden naar de loop() doorgeven zonder delay() in de loop() wilde ook niet.
Dus heb ik dan maar de pulse van zowel het hoge als het lage signaal gemeten, en kijk uiteindelijk in de loop() welke het moet zijn.
cpp code
Wat hieronder staat werkt trouwens wel.
De signaalgever voor een ander Arduino board zit er ook bij (tussen commentaar).
Het idee is overal hetzelfde. Maak een interrupt met CHANGE, en bereken met micros() de pulsebreedte en lees in de interrupt routine met digitalRead() of het signaal omhoog of omlaag was gegaan.
Vanaf dat moment ging het bij mij mis, de digitalRead() wilde niet, en de waarden naar de loop() doorgeven zonder delay() in de loop() wilde ook niet.
Dus heb ik dan maar de pulse van zowel het hoge als het lage signaal gemeten, en kijk uiteindelijk in de loop() welke het moet zijn.
cpp code
// Reading a servo signal (a ESC output signal from RC receiver)
//
//
// WARNING, BUGS:
// The delay(100) at the end of the loop() is needed.
// There is no test if the input does not get a signal anymore.
// A digitalRead() in the interrupt routine did not work very well.
//
// To create such a signal with another Arduino, see the Arduino Servo Knop Tutorial.
// Or use this:
/*
#include <Servo.h>
Servo myServo;
void setup()
{
myServo.attach(13);
myServo.write(50); // 0...180
}
void loop()
{
}
*/
const int servoInPin = 2; // either pin 2 or 3 is a interrupt input for Arduino Uno/Nano
// These two variables are used in the interrupt to calculate the width of the pulse.
volatile unsigned long _widthPulse[2];
volatile boolean _newPulse[2];
// Normal variables:
unsigned long previousMillis;
void setup()
{
Serial.begin(9600);
// The function "digitalPinToInterrupt" is preferred with "attachInterrupt".
attachInterrupt( digitalPinToInterrupt( servoInPin), servoInInterrupt, CHANGE);
}
void loop()
{
unsigned long width[2];
// Grab the width of the last pulses.
// It does not matter if a few pulses are missed.
// The interrupts are turned off, to avoid an interrupt during copying the width.
if( _newPulse[0])
{
noInterrupts();
width[0] = _widthPulse[0];
_newPulse[0] = false;
interrupts();
}
if( _newPulse[1])
{
noInterrupts();
width[1] = _widthPulse[1];
_newPulse[1] = false;
interrupts();
}
// Perhaps do some averaging, to avoid jitter.
// The function micros() is not very accurate, and other interrupts disturb the measurement.
// Once in a while, print the width
// Do not print them in every loop() iteration, keep the loop() at full speed running.
unsigned long currentMillis = millis();
if( currentMillis - previousMillis >= 500)
{
previousMillis = currentMillis;
// The lowest value is probably the right one.
unsigned long w;
if( width[0] < width[1])
w = width[0];
else
w = width[1];
// Tested:
// 0 degrees: 540
// 90 degrees: 1464
// 180 degrees: 2388
Serial.print( w);
Serial.print( ", ");
int degrees = map( w, 540, 2388, 0, 180);
Serial.print( degrees);
Serial.println();
}
delay(100); // this is needed, probably due to a bug.
}
// Interrupt for the incoming servo signal.
// I had serious problems by using digitalRead() to test if the signal
// was rising or falling.
// Therefor I calculate both the width of the pulse when high and when low.
void servoInInterrupt()
{
// static and locally used variables.
static byte _alternate = 0;
static unsigned long _previousMicros;
unsigned long _currentMicros = micros();
unsigned long _width = _currentMicros - _previousMicros;
_previousMicros = _currentMicros;
_widthPulse[_alternate] = _width;
_newPulse[_alternate] = true;
_alternate = ( _alternate == 0 ? 1 : 0 );
}
Re: Upgrade Kids-Car
Bedankt hier voor.
Ik heb net dat gaspedaaltje bestelt via Ebay, ff een paar weekjes geduld.....
Kan ik in tussentijd wel met deze code rommelen.
Ik heb net dat gaspedaaltje bestelt via Ebay, ff een paar weekjes geduld.....
Kan ik in tussentijd wel met deze code rommelen.
Re: Upgrade Kids-Car
@ Koepel
Nogmaals bedankt voor de code, ff een update
Deze werkt goed voor het uitlezen, heb het zo gek dat ie ook een servo aanstuurt (myServo.write(degrees).
Alleen zo als je al aangaf zonder delay werkt het niet.
De servo gaat naar de goeie positie en blijft daar ook,
maar dit gaat is stapjes.
Maar eens kijken of dit er nog uit te krijgen is.
De maker van de code heeft er ook iets instaan dat er een delay nodig is om (kan ik terug brengen naar 21)
het storings vrij te laten werken, en denk dat die in de weg zit voor het aansturen...
We rommelen gewoon verder.
Nogmaals bedankt voor de code, ff een update
Deze werkt goed voor het uitlezen, heb het zo gek dat ie ook een servo aanstuurt (myServo.write(degrees).
Alleen zo als je al aangaf zonder delay werkt het niet.
De servo gaat naar de goeie positie en blijft daar ook,
maar dit gaat is stapjes.
Maar eens kijken of dit er nog uit te krijgen is.
De maker van de code heeft er ook iets instaan dat er een delay nodig is om (kan ik terug brengen naar 21)
het storings vrij te laten werken, en denk dat die in de weg zit voor het aansturen...
We rommelen gewoon verder.
22 berichten
• Pagina 1 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 0 gasten