Page 21 sur 31

Re: [TUTO] Application web dynamique

Posté : mar. 24 mars 2020 11:09
par Bud Spencer
Hop, petit code du matin vite fait :)

Toujours dans l'esprit du projet 'redscreen', j'ajoute un nouvel objet à MyServer. Celui la en vue d'une évolution future qui viserait a supprimer l'Arduino et la liaison serie pour lire directement les valeurs de capteurs avec un adc MCP3208 depuis le programme du PI. J'ai appelé l'objet 'ADC' et toujours pareil, il expose Open() ,Close() et cette fois ci, juste une seule signature d'évènement ("data") puisque que la SPI ne revois que des données. En parametre du constructeur, il attend une instance de rpio et une valeur ticks qui définie la tempo de son timer interne en ms. Le reste du code n'est ni plus ni moins que du copier/coller de ce que j'avais déjà écrit pour le datalogger.
adcsrv.png
adcsrv.png (53.91 Kio) Vu 5049 fois

Re: [TUTO] Application web dynamique

Posté : mar. 24 mars 2020 11:15
par Bud Spencer
Coté programme principale, ajout de rpio et son initialisation. J'ai volontairement chargé et initalisé rpio dans le programme principale plutôt que dans l'objet qui utilise la spi, tout simplement parce que rpio pourra aussi etre utilisé pour gérer les pwm des vérins.
Pour le reste, rien de nouveau, instanciation d'un objet ADC en passant rpio et 100ms en paramètre, 'Ouverture' du timer par appel de Open() et toutes les données arrive dans l'event on(data) de l'objet.
adcsrv2.png
adcsrv2.png (37.09 Kio) Vu 5062 fois
/!\ démarrer le programme avec sudo pour accéder à la spi

Re: [TUTO] Application web dynamique

Posté : mar. 24 mars 2020 11:30
par Bud Spencer
Et voila le résultat avec les 3 objets 'serveur' activés. (Les adc sont tous à 0 du fait que je n'ais pas câblé de mcp3208). Avec un timer à 100 ms pour l'adc et des envois à 100ms sur le port serie et sur l'udp, la charge cpu reste très modeste donc si on considère que c'est soit port serie soit spi et non pas les 2 , cela laisse une grande marge de manœuvre pour faire d'éventuels calculs et asservir les verins pwm avec un seul et meme programme (qui en plus pourrais retourner des donnes sur un socket.io à destination de beaux clients web dynamique ;) ...)
adcsrv3.png
adcsrv3.png (23.56 Kio) Vu 5061 fois

Re: [TUTO] Application web dynamique

Posté : jeu. 26 mars 2020 10:22
par Bud Spencer
Le p’tit code du matin :D

Pas grand-chose, juste une petite démo pour utiliser les pwm puisque ca fait parti des choses jusque la non abordées dans ce tuto.
Sur les pi de première gen qui ont un port gpio 26 broches, une seule pin pwm dispo (gpio12 canal pwm 0) et sur ceux qui ont 40 broches, 4 pin pwm (gpio12/gpio18 sur canal pwm 0 et gpio13/gpio19 sur canal pwm 1).

Le code suivant utilise les 2 canaux pwm en meme temps. Il initialise les gpio 12 et 13 en mode pwm avec un rapport cyclique allant de 0 à 100. le timer incrémente x de 0 à 100 au pas de 10 puis applique la valeur pour gpio12 et l’inverse pour gpio13. Pour faire le test, montez une led sur chacune de ces 2 sorties. L’éclairage de gpio12 va aller en augmentant alors que celui de gpio13 va aller descendant.
Comme pour la spi, l’i2c, l’accès aux canaux pwm se fait par /dev/mem (gpiomem = false) donc le programme doit etre lancé avec une commande sudo.
pwm.png
pwm.png (13.54 Kio) Vu 5016 fois

Re: [TUTO] Application web dynamique

Posté : sam. 2 mai 2020 13:56
par BlackTom
Bonjour Monsieur Spencer,

Merci beaucoup pour ce tuto qui m'a permis de trouver toutes les billes à mon petit entraînement.
J'ai pu grâce à ce que vous avez expliqué :
- installer une version aussi récente que possible de NodeJS sur RPi Zero
- contrôler un petit servo moteur (module pigpio)
- échanger entre les clients et le serveur (module socket.io qui m'a donné du fil à retordre pour des raisons de versions incompatibles)

C'est sans doute pas grand chose mais je suis assez content de moi, alors un grand merci à vous !
:D

Re: [TUTO] Application web dynamique

Posté : dim. 3 mai 2020 18:39
par Bud Spencer
Bha, tu peux oublier les grands 'Vous' et les 'Monsieur' :lol:
Bien content que tout ca ait pu te servir (c'était un peu le but de ce tuto)
Visiblement tu as réussi a contrôler un servo-moteur en temps réel depuis une application web et c'est déjà loin d'etre 'pas grand chose ;)

Re: [TUTO] Application web dynamique

Posté : mar. 5 mai 2020 15:35
par BlackTom
Non non, j'insiste sur le vouvoiement, je suis tellement fan de vos films, en duo avec Monsieur Terence Hill ...

Bref, assez d'âneries, je trouve que ce n'est pas grand chose car c'est juste un servo moteur, branché directement sur le RPi, et pour le code, j'ai tout pompé sur ton tuto et divers exemples sur le net.
Le plus compliqué a été de comprendre qu'il fallait mettre à jour nodeJS "à la main", pour pouvoir faire fonctionner socket.io ...

La prochaine étape sera plus compliquée, je le crains. J'ai enfin reçu le reste de ma commande de composants, notamment un moteur pas à pas ... La partie électronique sera donc déjà plus ardue.
Et je pense que la partie logicielle sera également à revoir ...

Envoyé de mon ANE-LX1 en utilisant Tapatalk


Re: [TUTO] Application web dynamique

Posté : jeu. 7 mai 2020 08:01
par Bud Spencer
BlackTom a écrit :
mar. 5 mai 2020 15:35
Non non, j'insiste sur le vouvoiement, je suis tellement fan de vos films, en duo avec Monsieur Terence Hill ...
Vu comme ca, effectivement, ca change tout :lol:

Si tu as compris le concept et la façon de fonctionner de NodeJS, pas de raison que tu n'y arrives pas.

Re: [TUTO] Application web dynamique

Posté : jeu. 7 mai 2020 09:40
par BlackTom

Bud Spencer a écrit :Si tu as compris le concept et la façon de fonctionner de NodeJS, pas de raison que tu n'y arrives pas.
Oui oui, je n'ai pas vraiment de problème avec NodeJS. En même temps, je n'ai pas des besoins énormes : faire tourner un moteur à la demande (à distance) via une interface graphique ou le faire tourner à heure fixe. NodeJS permet de faire ça bien, simplement et plutôt proprement...

Pour moi, la vraie difficulté est la partie électronique Image

Possesseur d'un RPi Zéro WH pour un projet de distributeur de croquettes pour chats


Re: [TUTO] Application web dynamique

Posté : mar. 12 mai 2020 22:42
par BlackTom
Finalement, j'ai un petit problème avec NodeJS.
J'ai branché un buzzer passif sur mon RPi Zero. J'arrive à le faire siffloter un morceau mais je suis persuadé que ce que j'ai écrit pourrait être plus propre, plus concis ... mieux, quoi !

Code : Tout sélectionner

var Gpio = require('pigpio').Gpio;
var buzz = new Gpio(21, {mode: Gpio.OUTPUT});
var button = new Gpio(7, {mode: Gpio.PUD_DOWN}); //use GPIO pin 7 as input for button
const delay = require('delay');

//FREQUENCIES

const cL=129;
const cLS=139;
const dL=146;
const dLS=156;
const eL=163;
const fL=173;
const fLS=185;
const gL=194;
const gLS=207;
const aL=219;
const aLS=228;
const bL=232;

const c=261;
const cS=277;
const d=294;
const dS=311;
const e=329;
const f=349;
const fS=370;
const g=391;
const gS=415;
const a=440;
const aS=455;
const b=466;

const cH=523;
const cHS=554;
const dH=587;
const dHS=622;
const eH=659;
const fH=698;
const fHS=740;
const gH=784;
const gHS=830;
const aH=880;
const aHS=910;
const bH=933;

const sleep = (milliseconds) => {
    return new Promise(resolve => setTimeout(resolve, milliseconds))
  }

function PlayNote(freq, duree)
{
    buzz.pwmFrequency(freq);
    
    const Sing = async () => {
        await sleep(duree);
        buzz.pwmWrite(200);
        await sleep(duree);
        buzz.pwmWrite(0);
      }
      Sing();

      const Silence = async () => {
        await sleep(200);
        buzz.pwmWrite(0);
      }
      Silence();

}

console.log("Appuyez sur le bouton quand vous voulez.");
console.log("Ctrl+C pour sortir.");

async function loop()
{
    while(true)
    {
        etat = button.digitalRead();

        if ( etat == 1 )
        {
            PlayNote(a, 500);   await delay(500);
            PlayNote(a, 500);   await delay(500);
            PlayNote(f, 350);   await delay(350);
            PlayNote(cH, 150);  await delay(150);

            PlayNote( a, 500);  await delay(500);
            PlayNote( f, 350);  await delay(350);
            PlayNote( cH, 150); await delay(150);
            PlayNote( a, 1000); await delay(1000);
            PlayNote( eH, 500); await delay(500);

            /* etc etc ... */
        }
        await delay(50);
    }

}
loop();
Rien de bien transcendant, j'en suis sûr mais j'ai du mal à comprendre le fonctionnement des "await" ...

Les versions de NodeJS et npm (si ça peut être utile) :

Code : Tout sélectionner

pi@raspberrypi:~ $ node -v
v11.15.0
pi@raspberrypi:~ $ npm -v
6.14.4