Upgrade Kids-Car

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Upgrade Kids-Car

Berichtdoor AJK77 » 10 Sep 2017, 09:26

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
#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
Scope.jpg (172.32 KiB) 10551 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Upgrade Kids-Car

Berichtdoor Koepel » 10 Sep 2017, 12:28

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 :D 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 :shock:
Volgens mij is er een library die een servo signaal kan lezen. Ik ben vergeten hoe die heet :roll:
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.

Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Re: Upgrade Kids-Car

Berichtdoor AJK77 » 10 Sep 2017, 14:48

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.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Upgrade Kids-Car

Berichtdoor Koepel » 10 Sep 2017, 17:27

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 :(

Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Re: Upgrade Kids-Car

Berichtdoor AJK77 » 10 Sep 2017, 18:17

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.

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

Re: Upgrade Kids-Car

Berichtdoor shooter » 10 Sep 2017, 20:43

pass through zou ik met een relais wisselcontact doen, eventueel 2 relais naast elkaar.
paul deelen
shooter@home.nl

Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Re: Upgrade Kids-Car

Berichtdoor AJK77 » 10 Sep 2017, 21:30

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.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Upgrade Kids-Car

Berichtdoor Koepel » 10 Sep 2017, 22:37

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
// 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 );
}

Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Re: Upgrade Kids-Car

Berichtdoor AJK77 » 11 Sep 2017, 11:55

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.

Berichten: 8
Geregistreerd: 10 Sep 2017, 07:42
Woonplaats: Klazienaveen

Re: Upgrade Kids-Car

Berichtdoor AJK77 » 12 Sep 2017, 21:04

@ 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.

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten