LED inschakelen met drukknop

IDE gerelateerde berichten
Berichten: 5
Geregistreerd: 11 Okt 2020, 19:20

LED inschakelen met drukknop

Berichtdoor hans52 » 11 Okt 2020, 20:00

Ik ben een nieuweling binnen dit forum en ik zit met een probleem. Misschien kan iemand mij helpen.

Ik heb een buttonbox voor een flightsimulator gemaakt. Met de buttonbox, die werkt met een Arduino ProMicro, maak ik gebruik van 6 potentiometers en 16 drukknoppen. De software die ik gebruik is een aangepaste versie van wim_s_button_code.ino gemaakt door Wimwamyoe. De buttonbox werkt in principe naar behoren en alle potentiometers en drukknoppen werken.
Het probleem:
Ik wil graag dat er een LED gaat branden wanneer een drukknop wordt ingedrukt. Welke drukknop maakt niet uit, want die kan ik binnen de Flightsimulator verder definiëren. Ik gebruik al veel pinnen, maar pin 3 is nog vrij.
Een LED laten branden via een drukknop zou geen probleem moeten zijn, maar omdat ik gebruik maak van een 4x4 knoppen matrix, heb ik geen idee hoe ik dit kan realiseren. De rijen van de drukknoppen zijn aangesloten op de pinnen 7,6,5,4 en de kolommen zitten aan de pinnen 10,16,14 en 15. De potentiometers zitten aan de pinnen A0,A1,A2,A3,A8 en A9

Kan iemand mij helpen om op het goede spoor te komen?

Advertisement

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

Re: LED inschakelen met drukknop

Berichtdoor Koepel » 11 Okt 2020, 23:41

Kun je een link geven naar wim_s_button_code.ino en naar Wimwamyoe ?

Pinmapping van de Sparkfun Pro Micro (bron:https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/all)
Afbeelding

Wat zit er aan pin 0, 1 en 2 ?

Wil je bij iedere knop dat de led even aan gaat ?
Dus je wilt niet de led aanzetten vanaf de computer ?
Wil je dat de led een vaste tijd aan gaat, ongeacht hoe lang of hoe kort de knop wordt ingedrukt ?
Of wil je dat de led aan blijft zolang er een knop is ingedrukt ?
Mag er dan ook overschakeld worden naar andere knoppen, terwijl die led aan is ?

In de sketch wordt misschien een library gebruikt voor het keypad.
Dan wordt er ergens een functie aangeroepen om de ingedrukte knoppen op te vragen. Daar kun je toevoegen dat de led aan gaat.

Berichten: 5
Geregistreerd: 11 Okt 2020, 19:20

Re: LED inschakelen met drukknop

Berichtdoor hans52 » 12 Okt 2020, 10:51

De link naar deze .ino file is: https://drive.google.com/file/d/1dKqA0W ... hs0sM/view
De bouw van de door mij gebruikte buttonbox heb ik van wimwamjoey: https://www.youtube.com/watch?v=wkY1NsbWj5I&t=1154s
De .ino file heb ik aangepast door o.a. de opties voor de rotary encoders te verwijderen.

De pinnen 0,1 en 2 zijn negens aan verbonden.

De Arduino wordt ingebouwd in een Throttle (foto), die ik met een 3d-printer heb gemaakt. De bedoeling van de LED is, dat wanneer de parkeerrem (aan/uit schakelaar) wordt geactiveerd, dat de LED dan gaat branden. Dit is de enige LED in de Throttle. De LED moet dus blijven branden zolang de betreffende schakelaar 'aan' staat.

De throttle gebruikt libraries Keypad.h en Joystick.h en is, nadat de arduino van het programma is voorzien, een 'standalone' joystick, die als zodanig zelfstandig werkt. Het aansturen van de LED via de computer is dus niet wenselijk omdat alles nu via 1 usb-kabel met de pc verbonden is.

Ik hoop dat dit voldoende informatie is om voor een oplossing te komen.
Bijlagen
Throttle.jpg
Throttle.jpg (83.85 KiB) 8200 keer bekeken

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

Re: LED inschakelen met drukknop

Berichtdoor Koepel » 12 Okt 2020, 17:04

hans52 schreef:Ik hoop dat dit voldoende informatie is

Het is zelden genoeg ;) Je stelt een vraag over je sketch, zonder jouw sketch te laten zien. Dan krijg je soms als antwoord: "de fout zit in regel 139".

Welke code heeft de parkeerrem ?
Die staat hier:
Code: Alles selecteren
//BUTTON MATRIX
//first change number of rows and columns to match your button matrix,
//then replace all "?" with numbers (starting from 0)
byte buttons[NUMROWS][NUMCOLS] = {
  {?,?,?,?},
  {?,?,?,?},
  {?,?,?,?},
  {?,?,?,?}
};


Stel dat je een 'P' hebt voor de parkeerrem.

Dan kijk je wanneer die doorkomt. Daar kun je de code toevoegen.
Nog wel even bij de globale variabelen een const int ledPin = 2; toevoegen.
Code: Alles selecteren
....
for (int i=0; i<LIST_MAX; i++)   
{
  if ( buttbx.key[i].stateChanged )   
  {
   
    // ---------------------------------------
    // Toegevoegd in 2020
    // Led gaat aan voor parkeerrem
    // ---------------------------------------
    if( buttbx.key[i].kchar == 'P')   // hier de juist code in plaats van 'P'
    {
      if( buttbx.key[i].kstate == PRESSED)
      {
        digitalWrite( ledPin, HIGH);  // led aan
      }
      if( buttbx.key[i].kstate == RELEASED)
      {
        digitalWrite( ledPin, LOW);   // led uit
      }
    }
    // ---------------------------------------
    // Einde toevoeging
    // ---------------------------------------


    switch (buttbx.key[i].kstate)
    {
      case PRESSED:
      ....


Een led heeft een weerstand nodig, dat zul je wel weten neem ik aan.

Waarschijnlijk is er nog iets nodig voor als de schakelaar al is ingedrukt op het moment dat de buttonbox wordt aangezet.

Berichten: 5
Geregistreerd: 11 Okt 2020, 19:20

Re: LED inschakelen met drukknop

Berichtdoor hans52 » 13 Okt 2020, 09:52

Ik heb de toevoeging geprobeerd, maar er gaat ergens iets niet goed.
Ik wil de code graag toevoegen, maar wanneer ik de .ino file wil toevoegen als bijlage, krijg ik de melding dat een ino file niet toegevoegd kan/mag worden.
Hoe kan ik de code toevoegen?

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

Re: LED inschakelen met drukknop

Berichtdoor Koepel » 13 Okt 2020, 20:17

Wat gaat er mis met de sketch ? Krijg je foutmeldingen van de compiler ? Gaat het ledje niet aan ?

Lukt het niet om de sketch op dit forum in je bericht tussen code-tags te zetten ? Met de knop "Code" krijg je de code-tags [ code ] en [ / code ] maar dan zonder spaties. Als je daar je sketch tussen zet, dan ziet het er beter uit.
Misschien lukt een zip-bestand als bijlage ?

Sommigen zetten de sketch ergens ander neer, maar dat werkt niet altijd goed. Soms moet er ingelogd worden om het te kunnen zien.

Berichten: 5
Geregistreerd: 11 Okt 2020, 19:20

Re: LED inschakelen met drukknop

Berichtdoor hans52 » 13 Okt 2020, 23:33

De code controleren en overzetten naar de Arduino gaat probleemloos, alleen de LED gaat niet branden. Ik heb geprobeerd om de LED aan te sluiten op pin 2 en pin 3 (uiteraard de pinmode aangepast), maar helaas, de LED doet niet wat ik graag zou willen.
Het zippen van de file was ook geen succes, dus ik heb de code op de aangegeven wijze tussen de codes gekopieerd.
Ik hoop dat je iets kunt vinden waarom het fout gaat. In ieder geval hartelijk dank voor de snelle reactie.
Hans


Code: Alles selecteren
/*Aangepaste code van de wim_s_button_code.ino gemaakt door Wimwamyoe
 * De pinnummering is gebaseerd op het gebruik van een Arduino ProMicro.
 * Deze code wordt gebruikt om binnen X-Plane 11 de Boeing 737 Throttle
 * aan te sturen, die gemaakt is naar het voorbeeld van Heli Mech uit Brunei.
 * Totaal worden er 6 potentiometers gebruikt en 10 knoppen. (kan zonder aanpassing uitgebreid worden naar 16 knoppen.)
 * Het is de bedoeling dat 1 knop gekoppeld wordt aan een LED. Deze LED heeft de naam parkLed
 * en moet aan gaan wanneer de knop voor de 'ParkBrake' actief is.
*/

#include <Keypad.h>
#include <Joystick.h>

//DEFINITIONS
#define ENABLE_PULLUPS
#define NUMBUTTONS 16 //aantal knoppen
#define NUMROWS 4 //aantal rijen
#define NUMCOLS 4 //aantal kolommen
//#define ledPin 3  //LED voor de ParkBrake
const int ledPin=3;

//KNOPPEN MATRIX
//Groepeer de knoppen en nummer ze. Begin bij 0.
byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3},
  {4,5,6,7},
  {8,9,10,11},
  {12,13,14,15}
 
};

//KNOPPEN MATRIX DEEL 2
byte rowPins[NUMROWS] = {7,6,5,4}; //Geef de pinnummers aan voor de rijen
byte colPins[NUMCOLS] = {10,16,14,15}; //Geef de pinnummers aan voor de kolommen
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

//JOYSTICK SETTINGS
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK,
 16, //Aantal knoppen
  0, //Aantal HAT-switches.
  //Set de Assen op "true" van de potentiometers die je gaat gebruiken
  true, // y axis
  true, // x axis
  true, // z axis
  true, // rx axis
  true, // ry axis
  true, // rz axis
  false, // rudder
  false, // throttle
  false, // accelerator
  false, // brake
  false); // steering wheel


const int numReadings = 20;
 
int readings[numReadings];      // the readings from the analog input
int index = 0;              // the index of the current reading
int total = 0;                  // the running total
int currentOutputLevel = 0;

//POTENTIOMETERS DEEL 1
//Voeg alle assen toe die hierboven op 'Enabled' staan
int zAxis_ = 0;
int RxAxis_ = 0;   
int xAsis_ = 0;
int yAxis_ = 0;
int RyAxis_ = 0;
int RzAxis_ = 0;
               
//POTENTIOMETERS  DEEL 2
//Geef aan het pinnummer waaraan de potentiometers gekoppeld is.
int potentiometerPin1 = A0;
int potentiometerPin2 = A1;
int potentiometerPin3 = A2;
int potentiometerPin4 = A3;
int potentiometerPin5 = A8;
int potentiometerPin6 = A9;
const bool initAutoSendState = true;


void setup() {
  Joystick.begin();
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  CheckAllButtons();
  CheckAllPotentiometers();
 
}

//POTENTIOMETERS DEEL 3
// Verander de details van iedere potentiometer die je gebruikt.
void CheckAllPotentiometers(){
                           
  //potentiometer 1 Speedbrake
  currentOutputLevel = getAverageOutput(potentiometerPin1);
  zAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setZAxis(zAxis_);

  //potentiometer 2 Thrust 1
  currentOutputLevel = getAverageOutput(potentiometerPin2);
  RxAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setRxAxis(RxAxis_);

 //potentiometer 3 Thrust 2
  currentOutputLevel = getAverageOutput(potentiometerPin3);
  yAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setYAxis(yAxis_);

 //potentiometer 4 Thrust Reverse 1
  currentOutputLevel = getAverageOutput(potentiometerPin4);
  xAsis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setXAxis(xAsis_);
 
//potentiometer 5 Thrust Reverse 2
  currentOutputLevel = getAverageOutput(potentiometerPin5);
  RyAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setRyAxis(RyAxis_);

//potentiometer 6 Flaps
  currentOutputLevel = getAverageOutput(potentiometerPin6);
  RzAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setRzAxis(RzAxis_);
 

}

int getAverageOutput(int pinToRead){
  index = 0;
  total = 0;
 
  while (index < numReadings){
    readings[index] = analogRead(pinToRead);
    total = total + readings[index];
    index = index + 1;
    //delay (1);
  }
  return total / numReadings;
}


void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
     // ---------------------------------------
    // Toegevoegd in 2020
    // Led gaat aan voor parkeerrem
    // ---------------------------------------
               if( buttbx.key[i].kchar == '1')   // hier de juist code in plaats van 'P'
    {
      if( buttbx.key[i].kstate == PRESSED)
      {
        digitalWrite( ledPin, HIGH);  // led aan
      }
      if( buttbx.key[i].kstate == RELEASED)
      {
        digitalWrite( ledPin, LOW);   // led uit
      }
   // ---------------------------------------
    // Einde toevoeging
    // ---------------------------------------

    }
            switch (buttbx.key[i].kstate) {
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}

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

Re: LED inschakelen met drukknop

Berichtdoor Koepel » 14 Okt 2020, 00:23

Dit was een belangrijke vraag:
Welke code heeft de parkeerrem ?
Die staat hier:
Code: Alles selecteren
//BUTTON MATRIX
//first change number of rows and columns to match your button matrix,
//then replace all "?" with numbers (starting from 0)
byte buttons[NUMROWS][NUMCOLS] = {
  {?,?,?,?},
  {?,?,?,?},
  {?,?,?,?},
  {?,?,?,?}
};



Als ik die code wist, dan kon ik dat meteen in de sketch zetten.
En dat weet ik nu nog steeds niet.
Laat ik maar gokken op een 1, dus niet de leesbare ASCII waarde van 1, maar een gewoon getal, een één.

Dan test je in het if-statement ook op het getal één:
Code: Alles selecteren
if( buttbx.key[i].kchar == 1)


De Keypad library wordt vrijwel altijd met de leesbare ASCII tekens gebruikt.
Daarom zie je in alle voorbeelden een '0', '1', '2', '3' enzovoorts, met enkele quotes.
https://www.pjrc.com/teensy/td_libs_Keypad.html
https://playground.arduino.cc/Code/Keypad/
https://github.com/Chris--A/Keypad/blob/master/examples/HelloKeypad/HelloKeypad.ino
Als het op die manier was, dan zou je dus ook in de computer testen op de ASCII waarde.
Nu gebruik je gewone getallen, dan kan ook.

Kun je de tekst van de sketch netter maken ? Zet alle spaties, alle komma's, alle inspringen goed. Als de tekst van de sketch een rommeltje is, dan zal de werking ook wel een rommeltje zijn :roll:

Berichten: 5
Geregistreerd: 11 Okt 2020, 19:20

Re: LED inschakelen met drukknop

Berichtdoor hans52 » 14 Okt 2020, 11:47

HET WERKT!!!

Ik heb nog eens gekeken naar de code
if( buttbx.key[i].kchar == 1)
Ik zag dat bij mij de 1 tussen de ' ' stond.
Die ' heb ik verwijderd en alles werkt nu zoals ik het voor ogen had.
Ik kan nu ieder getal tussen de 0 en de 15 gebruiken, waarna de LED gaat branden bij de daarbij behorende toets.
PERFECT.
Ik zal de code nog gaan fatsoeneren, maar hartelijk dank voor alles!!!
Hans

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

Re: LED inschakelen met drukknop

Berichtdoor Koepel » 15 Okt 2020, 10:49

Mooi dat het werkt :D

Als je de pinnen voor de I2C bus vrij maakt, dan kun je met een I/O expander extra pinnen maken: https://www.adafruit.com/product/732.
Je kunt ook de leds van een ledstrip gebruiken. Die kun je los knippen en dan met draden weer verbinden, zodat je ze in elke positie kunt monteren. De meeste ledstrips gebruiken slechts één pin van de Arduino en dat kan iedere willekeurige digitale pin zijn.
Er zijn dus nog mogelijkheden genoeg 8-)

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten