Salve a tutti, vorrei integrare nel mio scketch per una ButtonBox simracing, una piccola parte di codice che utilizzi le variazioni di stato di un interruttore (quelli stile racing con coprilevetta) per simulare la pressione temporanea di un pulsante al pc. Avviso che non sono bravo nel creare uno skecth, ma se la leggo riesco per lo meno a capirne il funzionamento, sino ad ora ho scopiazzato allegramente sketch presi in rete!
Buongiorno e benvenuto nella sezione Italiana del forum,
cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto.
Grazie Guglielmo! mi scuso per non aver letto il regolamento.. comunque ho appena effettuato la presentazione!
Non mi intendo di simracing, ma provo a tradurre.
Tu hai una ButtonBox implementata su Arduino e vuoi che al cambiamento di stato di un interruttore (collegato a un pin in input di Arduino) si verifichi una variazione di stato di un pin in output dello stesso Arduino che simuli la pressione momentanea di un pulsante.
Se è così le domande sono:
- Per cambiamento di stato di un interruttore intendi ON->OFF oppure OFF->ON o entrambi?
- Quanti millisecondi deve durare la pressione simulata del pulsante?
Ciao,
P.
Ciao, più o meno si, ma non deve attivare un pin out, bensì inviare un segnale al pc al quale è collegato come controller che sia visibile a lui come la pressione di un pulsante della durata di 50millis, e questo ad ogni variazione di stato ....
In pratica la levetta con coperchio rosso in questa foto deve inviare un segnale al pc visibile come se fosse la pressione di un pulsante per 50millis
e come sarebbe la trasmissione del fatto?
continua
ovvero alla pressione di un pulsante (normale) cosa fa arduino?
ed al suo rilascio?
Ciao Standardoil, la configurazione "classica" della button sarebbe questa allegata, a me interessa che l' interruttore invii solo un segnale al pc, emulando quelli degli altri pulsanti.. insomma, dovrei aggiungere un interruttore ad un altro pin che però ad ogni variazione on-off, invii il segnale del pulsante pulsante 33 (visto che questo scketch ne prevede 32)
Button32puls.ino (4,1 KB)
Sono col telefono
Non posso vedere il file.ino
@Standardoil: Usa le librerie keyboard e joystick e, in funzione del tasto premuto su una tastiera (riga/colonna), invia delle info al PC:
void CheckAllButtons(void) {
if (buttbx.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( buttbx.key[i].stateChanged )
{
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;
}
}
}
}
}
Guglielmo
Grazie, ma nel mio caso serve per solo un interruttore, quindi potrei escludere l'i++.
una cosa sola, in questo sketch invierebbe un segnale continuo vero? a me servirebbe solo un impulso di 50/100millis al variare di stato..
altra domanda, in questo sketch è Arduino che effettua le verifiche degli stati periodicamente se l'ho letto bene, sarebbe meglio la sola lettura del variare di stato "in diretta" diciamo così?
Allora ... a te serve un pin che cambia "stato" per 50/100 millis (LOW, HIGH per 50/100 ms, LOW) quando commuti l'interruttore (da ON a OFF e da OFF a ON) o ti serve la simulazione della pressione di un tasto da tastiera come nell'esempio che hai messo? Perché non sto capendo cosa realmente ti occorre ...
Guglielmo
Si Guglielmo, mi serve che simuli la pressione momentanea di un tasto al variare dello stato per soli 50/100millis. non deve attivarmi un pin, ma solo simulare che sia la pressione di un tasto al variare dello stato!
praticamente deve svolgere la stessa funzione di un'altro qualsiasi pulsante della Button dimenticando che sia un interruttore!
La tastiera è multiplata e rimane libero un solo canale
Ma non sapendo come sono collegati i singoli tasti non so se possiamo usarlo
Tocca di
Cercare un piedino libero e collegarvi l'interruttore
Aggiungere un item joistick
Al termine della scansione di tastiera leggere lo stato del piedino
Se variato salvarlo
Armare un timer con millis
Durante il tempo del timer eseguire il set del 33 elemento del joystick
Allora, ho trovato questa classe (credo si chiami così) utilizzata da simhub per la configurazione di un singolo pulsante sul pin 15. Posso modificare questa classe adattando l'interruttore perchè faccia la stessa cosa di un pulsante al variare dello stato?
#ifndef __SHBUTTON_H__
#define __SHBUTTON_H__
#include <Arduino.h>
#include "SHFastIO.h"
typedef void(*SHButtonChanged) (int, byte);
class SHButton {
private:
FastDigitalPin button;
uint8_t buttonState;
int buttonLastState = -1;
bool vccToPinWiring;
unsigned long buttonLastStateChanged;
byte id;
SHButtonChanged shButtonChangedCallback;
int logicMode;
int getState(int value) {
int res = 0;
if (!vccToPinWiring) {
res = value == HIGH ? 0 : 1;
}
else {
res = value == HIGH ? 1 : 0;
}
if (logicMode == 1) {
res = res ? 0 : 1;
}
return res;
}
public:
void begin(byte buttonid, uint8_t buttonPin, SHButtonChanged changedcallback, bool vccToPinWiring, int logicMode) {
button.begin(buttonPin);
this->vccToPinWiring = vccToPinWiring;
this->logicMode = logicMode;
if (buttonPin > 0) {
if (!vccToPinWiring) {
pinMode(buttonPin, INPUT_PULLUP);
}
else {
pinMode(buttonPin, INPUT);
}
}
id = buttonid;
buttonLastState = getState(button.digitalRead());
shButtonChangedCallback = changedcallback;
if (buttonLastState)
shButtonChangedCallback(id, buttonLastState);
}
uint8_t getPressed() {
return !buttonLastState;
}
void read() {
buttonState = getState(button.digitalRead());
if (buttonState != buttonLastState && buttonLastStateChanged - millis() > 50) {
shButtonChangedCallback(id, buttonState);
buttonLastState = buttonState;
buttonLastStateChanged = millis();
}
}
};
#endif
per chiarire, il settings del pulsante e del relativo pin avviene qui:
/ ----------------------- ADDITIONAL BUTTONS ---------------------------------------------------------------
// https://github.com/zegreatclan/SimHub/wiki/Arduino-Press-Buttons
// ----------------------------------------------------------------------------------------------------------
#define ENABLED_BUTTONS_COUNT 1 //{"Group":"Additional Buttons","Name":"ENABLED_BUTTONS_COUNT","Title":"Additional buttons (directly connected to the arduino, 12 max) buttons count","DefaultValue":"0","Type":"int","Max":12}
#ifdef INCLUDE_BUTTONS
#define BUTTON_PIN_1 15 //{"Name":"BUTTON_PIN_1","Title":"1'st Additional button digital pin","DefaultValue":"3","Type":"pin;Button 1","Condition":"ENABLED_BUTTONS_COUNT>=1"}
#define BUTTON_WIRINGMODE_1 0 //{"Name":"BUTTON_WIRINGMODE_1","Title":"1'st Additional button wiring","DefaultValue":"0","Type":"list","Condition":"ENABLED_BUTTONS_COUNT>=1","ListValues":"0,Pin to GND;1,VCC to pin"}
#define BUTTON_LOGICMODE_1 0 //{"Name":"BUTTON_LOGICMODE_1","Title":"1'st Additional button logic","DefaultValue":"0","Type":"list","Condition":"ENABLED_BUTTONS_COUNT>=1","ListValues":"0,Normal;1,Reversed"}
non saprei, non ho lo hardware e quindi non posso provare
ma io guarderei bene due cose:
primo la macro LIST_MAX
mi sembra che sia inizializzata a 10, mentre tu hai una matrice di 25 pulsanti, non so bene cosa significhi
secondo: guarda bene gli esempi della libreria keypad, a me sembra che qualcosa si possa fare da li
per le list max non credo ci siano problemi, i 25 li vede..
Eh, purtroppo non sò farlo!!! mannaja a me!
Scusatemi, mi aiutate a leggere dove invia il segnale al pc in quella parte di sketch?
magari basterebbe mettere due righette lì e risolvo, ripeto, i list max e simili non sono un problema perche con quello sketch vede tutti i pulsanti tranquillamente..
Perchè li da quel che ho capito parla di cambiamenti di stati, ed invia il segnale solo a pulsante premuto.. magari basta aggiungere una semplice righetta per dire di inviare il segnale solo per 100 millisecondi e ad ogni variazione di stato!
Ma non ne sono capace...
Sono le due righe Joistick.setButton(
Le vedi nel post 10
Ma non è così semplice: sai realizzare la voluta temporizzazione in maniera non bloccante?
Sai cosa significano i due argomenti di quella funzione?
In particolare il secondo