Deadzone programmeren

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 08 Apr 2018, 20:31

Deadzone programmeren

Berichtdoor AndreB » 23 Dec 2018, 21:04

Beste,

een aantal maanden geleden heb ik een testkastje gemaakt om joysticks te testen en af te stellen in de middenstand.
Met hulp van een aantal forum leden hier ben ik zeer goed op weg geholpen en uiteindelijk is het allemaal gelukt.
Dit was een arduino nano met een 2x16 regelig display waar je de waarde v/d potmeter in procenten ziet staan, middenstand potmeter
is 0 procent, vol naar links of rechts is 100 procent. Als extra heb ik nog 2 digitale ingangenm gebruikt om de stuurswitch weer te
geven op het display. Na een paar maanden deze testkast al veelvuldig gebruikt te hebben zou ik nog graag 1 ding aangepast willen hebben.
Dit is de deadzone, bij het afstellen in de middenstand is het best moeilijk om deze exact op 0 procent te krijgen, dit mag best 2a3
procent afwijken aangezien er altijd lichte speling op de overbrenging van het tandwieltje naar de tandheugel zit. Graag zou ik het gebied van
0....3 procent als deadzone willen hebben, dus 0 procent aan blijven geven, maarrrr als de potmeter uit de deadzone komt moet deze niet beginnen
met 3 procent maar gewoon vanaf 1 procent. Ik heb echt al uren gezocht maar ik kom er gewoon niet uit hoe dit te programmeren.
Hierbij mijn sketch van de testkast:

#include <LiquidCrystal.h> // include the LCD library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int potPin = A0; //Potentiometer input pin
int potValue1 = 0;
int potValue2 = 0; // final display variable
const int button1Pin = 7;
const int button2Pin = 8;
int buttonState = 0;
void setup() {
lcd.begin(16, 2); // lcd rows and columns
lcd.setCursor(0,0);
lcd.print(" JLG "); // title of sorts
lcd.setCursor(0,1);
lcd.print(" JOYSTICK TEST ");
delay(1000);
lcd.clear();
pinMode (button1Pin, INPUT);
pinMode (button2Pin, INPUT);
}

void loop()
{
int button1State, button2State;
button1State = digitalRead (button1Pin);
button2State = digitalRead (button2Pin);
if (button1State == HIGH)
{
lcd.setCursor (0, 0);
lcd.print (" STUREN LINKS ");
}
else
{
lcd.setCursor (0, 0);
lcd.print(" ");
if (button2State == HIGH)
{
lcd.setCursor (0, 0);
lcd.print (" STUREN RECHTS ");
}
else
{
lcd.setCursor (0, 0);
lcd.print(" ");
}
}
// read then divide the input(max 1020 in this case) by 10
potValue1 = analogRead(potPin);
// divide by 1.02 to get percentage
potValue2 = map(potValue1, 0, 1023, 0, 200);
// set cursor to second row, first column
lcd.setCursor(0, 1);
// display final percentage
if(potValue2<100){
lcd.print(100-potValue2);
}
else
{
lcd.print(potValue2-100);
}
//print the percent symbol at the end
lcd.print("%");
//wait 0.1 seconds
delay(350);
//wipe the extra characters
lcd.print(" ");
delay(1);
lcd.setCursor(5,1);
if(analogRead(0)>490 && analogRead(0)<530){
lcd.print(" CENTER ");
}else if(analogRead(0)<490){
lcd.print(" VOORUIT ");
}else if(analogRead(0)>530){
lcd.print("ACHTERUIT");

}

}

Alvast bedankt mensen!

Advertisement

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

Re: Deadzone programmeren

Berichtdoor shooter » 24 Dec 2018, 18:27

eigenlijk, wil je dius die zone opbreken in twee, of zelfs in drie stukken, zoals map (0,490,-100,-1) en 530,1023,+1,+100)
en (490,530,-1,+1)
let wel op de uiteinden maar dat moest je toch al.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Apr 2018, 20:31

Re: Deadzone programmeren

Berichtdoor AndreB » 24 Dec 2018, 23:38

Beste,

bedankt voor je bericht, je bedoelt eigenlijk dat ik dan 3 mappen aan moet maken of komt dit in 1 map te staan?

Mvg Andre

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

Re: Deadzone programmeren

Berichtdoor shooter » 28 Dec 2018, 14:34

drie mappen met elk hun eigen stukje code erin.
en alleen die gebruiken die je kunt gebruiken.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Apr 2018, 20:31

Re: Deadzone programmeren

Berichtdoor AndreB » 02 Jan 2019, 21:46

Beste,

ik kom er niet echt uit met de map functie.
Ben al enige tijd aan het stoeien met de code maar het lukt me niet.
Dit is een gedeelte uit mijn sketch:

if(potValue2<-3){
map(potValue1, 0, 490, -100, -1);
}
else if(potValue2>3){
map(potValue1, 530, 1023, +1, +100);
}
else if(potValue2>-3 && potValue2<3){
map(potValue1, 490, 530, -1, +1);
}

Hij blijft gewoon 100 procent aangeven, waarde verandert niet.
Ik weet niet of het kan wat ik gedaan heb met de if else functie.
Graag hoop ik dat je er nog even naar wilt kijken (of iemand anders).
Alvast bedankt voor alle hulp.

Mvg Andre

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

Re: Deadzone programmeren

Berichtdoor shooter » 02 Jan 2019, 23:45

Bijna goed, ik zat even te kijken waar je die drie vandaan hebt dat moet dus zijn if ((potValue1 >= 490) && (potvalue1 <= 530))
en geen potvalue2 gebruiken want dat gaat niet goed. Gebruik direct wat je nodig hebt en geen rare sprongen maken.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Apr 2018, 20:31

Re: Deadzone programmeren

Berichtdoor AndreB » 04 Jan 2019, 21:57

Beste Paul,

ik kom er echt even niet meer uit, de waarde blijft gewoon 100% aangeven ongeacht de ingangs spanning
die ik verander met de potmeter. Ik heb het idee dat het in dit gedeelte nu mis gaat:

if(potValue2<100){
lcd.print(100-potValue2);
}
else
{
lcd.print(potValue2-100);
}

Hierbij mijn sketch zoals ik het nu heb:

if((potValue1 >= 490) && (potValue1 <= 530)){
map(potValue1, 490, 530, -1, +1);
}
if(potValue1<490){
map(potValue1, 0, 490, -100, -1);
}
else if(potValue1>530){
map(potValue1, 530, 1023, +1, +100);
}
// set cursor to second row, first column
lcd.setCursor(0, 1);
// display final percentage
if(potValue2<100){
lcd.print(100-potValue2);
}
else
{
lcd.print(potValue2-100);
}
//print the percent symbol at the end
lcd.print("%");
//wait 0.1 seconds
delay(350);
//wipe the extra characters
lcd.print(" ");
delay(1);
lcd.setCursor(5,1);
if(analogRead(0)>490 && analogRead(0)<530){
lcd.print(" CENTER ");
}else if(analogRead(0)<490){
lcd.print(" VOORUIT ");
}else if(analogRead(0)>530){
lcd.print("ACHTERUIT");

}

}

De teksten Center/Vooruit/Achteruit worden wel correct weergegeven.
Hopelijk kun je me nog iets verder op weg helpen, ben al wel heel wat uurtjes aan het stoeien geweest :D

Mvg Andre

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

Re: Deadzone programmeren

Berichtdoor shooter » 09 Jan 2019, 21:52

Je gebruikt nog steeds potvalue 2 en een map daar moet dus wel een variabele voor staan zoals
Code: Alles selecteren
 if((potValue1 >= 490) && (potValue1 <= 530)){
dis=  map(potValue1, 490, 530, -1, +1);
}
if(potValue1<490){
dis=map(potValue1, 0, 490, -100, -1);
}
else if(potValue1>530){
dis = map(potValue1, 530, 1023, +1, +100);

dan staat er dus een getal van -100 tot +100.
die dis is dus eigenlijk jouw potvalue2 (maar dan anders.
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten