7
« le: décembre 31, 2015, 01:19:37 pm »
J’ai chargé ce skecth avec 4 inters afin de voir le fonctionnement, et bien sur, je ne peux lire le numéro du poussoir
J’ai fait plusieurs manipulations : suppression de la fonction « LirePoussoirs », de la variable resultat , déplacement des variables « resultat » , « numPoussoir » dans setup , loop .
Je ne maitrise pas la programmation pour résoudre seul ce problème
boolean ancienA0 = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1 = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2 = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3 = HIGH;
boolean nouveauA3 = HIGH;
int lirePoussoirs()
{
int resultat;
int numPoussoir=4;
nouveauA0 = digitalRead(A0);
if (ancienA0 != nouveauA0)
{
ancienA0 = nouveauA0;
numPoussoir = 0;
}
else
{
nouveauA1 = digitalRead(A1);
if (ancienA1 != nouveauA1)
{
ancienA1 = nouveauA1;
numPoussoir = 1;
}
else
{
nouveauA2 = digitalRead(A2);
if (ancienA2 != nouveauA2)
{
ancienA2 = nouveauA2;
numPoussoir = 2;
}
else
{
nouveauA3 = digitalRead(A3);
if (ancienA3 != nouveauA3)
{
ancienA3 = nouveauA3;
numPoussoir = 3;
}
}
}
}
return resultat;
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
byte evenement = lirePoussoirs();
Serial.print("N° inter : ");
Serial.println(lirePoussoirs());
Serial.println(resultat);
delay(100);
}
J’ai réalisé , en modifiant celui de jlb « un servo un inter » , un programme que j’installe sur des ATtiny 85
Ce programme est superbe , cela crée un mouvement très réaliste de l’aiguille
#include "Servo8Bit2.h"
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
const boolean DROIT = true;
const boolean DEVIE = false;
Servo8Bit2 monServo;
int vitesse = 1;
int angle;
byte etatServo = SERVO_A_ANGLE_MIN;
const int angleMin = 1250;
const int angleMax = 1720;
boolean etatInter = DEVIE;
int Led = 3; // Led TCO sur patte 2 ATtiny 85
int pinInter = 0; // Interrupteur sur patte 5 ATtiny 85
int etatcontact;
boolean lireInter()
{
boolean resultat ;
etatcontact = digitalRead(pinInter);
if (etatcontact == HIGH) {
resultat = DROIT;
}
else resultat = DEVIE;
}
void setup()
{
pinMode(Led,OUTPUT);
monServo.attach(1); // Servo sur patte 6 ATtiny 85
angle = angleMin;
vitesse = 1;
}
void loop()
{
monServo.writeMicroseconds(angle);
/* calcule le nouvel angle */
angle = angle + vitesse;
if (angle > angleMax) {
angle = angleMax;
vitesse = 0;
monServo.detach();
etatServo = SERVO_A_ANGLE_MAX;
}
else if (angle < angleMin) {
angle = angleMin;
vitesse = 0;
monServo.detach();
etatServo = SERVO_A_ANGLE_MIN;
}
byte evenement = lireInter();
if (evenement == DROIT) {
digitalWrite(Led,1);
monServo.attach(1);
switch (etatServo)
{
case SERVO_A_ANGLE_MIN:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
vitesse = 1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
break;
}
}
if (evenement == DEVIE) {
digitalWrite(Led,0);
monServo.attach(1);
switch (etatServo)
{
case SERVO_A_ANGLE_MAX:
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
vitesse = -1;
etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
break;
}
}
delay(2);
}
Mon objectif est d’installer ce programme sur carte nano , mais avec 4 commandes
En reprenant le skecth de jlb et les remarques de DDEF et après avoir réalisé la manip d’essai des 8 inters sur une entrée , je suis arrivé à ce début( semblant) de programme :
// A PRIORI PAS DE MODIFICATION
#include <Servo.h>
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
const boolean DROIT = true; // MODIFICATION PROG
const boolean DEVIE = false; // MODIFICATION PROG
const int angleMin = 1250;
const int angleMax = 1750;
struct DescripteurServo {
Servo objetServo;
int vitesse;
int angle;
int pin;
byte etatServo;
};
struct DescripteurServo servoMoteur[4];
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
//variable pour les inters
boolean ancienA0 = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1 = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2 = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3 = HIGH;
boolean nouveauA3 = HIGH;
//const int pinPoussoirs = 0; // A SUPPRIMER
// MODIFICATION DE LirePoussoirs et Lire Evenement AFIN D’AVOIR LE NUMERO
// ET L’ETAT DE L’INTER
int lirePoussoirs()
{
int resultat;
// int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128; // A SUPPRIMER
numPoussoir = 4; // Ou faut il déclarer numPoussoir ?
nouveauA0 = digitalRead(A0);
if (ancienA0 != nouveauA0)
{
ancienA0 = nouveauA0;
numPoussoir = 0;
}
else
{
nouveauA1 = digitalRead(A1);
if (ancienA1 != nouveauA1)
{
ancienA1 = nouveauA1;
numPoussoir = 1;
}
else
{
nouveauA2 = digitalRead(A2);
if (ancienA2 != nouveauA2)
{
ancienA2 = nouveauA2;
numPoussoir = 2;
}
else
{
nouveauA3 = digitalRead(A3);
if (ancienA3 != nouveauA3)
{
ancienA3 = nouveauA3;
numPoussoir = 3;
}
}
}
}
int nouvelEtatPoussoir = etatPoussoir; /* à priori rien ne change */
switch (etatAutomate) {
case NON_PRESSE:
if (numPoussoir < 4)
etatAutomate = ENFONCE;
break;
case ENFONCE:
if (numPoussoir < 4) {
etatAutomate = PRESSE;
nouvelEtatPoussoir = numPoussoir;
}
else {
etatAutomate = NON_PRESSE;
}
break;
case PRESSE:
if (numPoussoir == 4) {
etatAutomate = NON_PRESSE;
nouvelEtatPoussoir = -1;
}
break;
}
return nouvelEtatPoussoir;
}
byte lireEvenement(int *numPoussoir)
{
byte evenement;
int nouvelEtatPoussoir = lirePoussoirs();
if (nouvelEtatPoussoir == etatPoussoir)
evenement = AUCUN_EVENEMENT;
if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
evenement = EVENEMENT_PRESSE;
if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
evenement = EVENEMENT_RELACHE;
etatPoussoir = nouvelEtatPoussoir;
*numPoussoir = etatPoussoir;
return evenement;
}
// A PRIORI PAS DE MODIFICATION
void setup()
{
/* Initialisation des servos */
int numServo;
for (numServo = 0; numServo < 4; numServo++) {
servoMoteur[numServo].angle = angleMin;
servoMoteur[numServo].vitesse = 0;
servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
servoMoteur[numServo].pin = numServo + 2;
servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
}
/* Initialisation des inters */
pinMode(A0, INPUT_PULLUP); // BP 0
pinMode(A1, INPUT_PULLUP); // BP 1
pinMode(A2, INPUT_PULLUP); // BP 2
pinMode(A3, INPUT_PULLUP); // BP 3
}
// A PRIORI PAS DE MODIFICATION
void gereServo(int numServo)
{
servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
if (servoMoteur[numServo].angle > angleMax) {
servoMoteur[numServo].angle = angleMax;
servoMoteur[numServo].vitesse = 0;
servoMoteur[numServo].objetServo.detach();
servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
}
else if (servoMoteur[numServo].angle < angleMin) {
servoMoteur[numServo].angle = angleMin;
servoMoteur[numServo].vitesse = 0;
servoMoteur[numServo].objetServo.detach();
servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
}
}
//MODIFICATION J’AI PRIS DROIT = VERS ANGLE MAX ( A VERIFIER)
void evenementServo DROIT (int numServo)
{
switch (servoMoteur[numServo].etatServo) {
servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
servoMoteur[numServo].vitesse = 1;
servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
break;
}
}
//MODIFICATION J’AI PRIS DEVIE = VERS ANGLE MIN ( A VERIFIER)
void evenementServo DEVIE (int numServo)
{
switch (servoMoteur[numServo].etatServo) {
servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
servoMoteur[numServo].vitesse = -1;
servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
break;
}
}
//MODIFICATION
void loop()
{
int numServo;
for (numServo = 0; numServo < 4; numServo++) gereServo(numServo);
// byte evenement = lireEvenement(&numServo);
if (evenement == EVENEMENT_DROIT) {
evenementServo DROIT(numServo);
if (evenement == EVENEMENT_DEVIE) {
evenementServo DEVIE(numServo);
}
delay(3);
}
Je pense être arrivé au max de mes compétences .
Sans aide , je ne pourrai avancer
Merci d'avance à DDEF
Bonnes fêtes à tous
Philippe