Converteer python naar rpi-gpio nodejs

Met behulp van het onderstaande python-script kan ik mijn motor laten lopen:

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BOARD)

Motor1A = 16
Motor1B = 18
Motor1E = 22

GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)

print "Turning motor on"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)

sleep(2)

print "Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)

GPIO.cleanup()

Ik zou de motor van mijn knooppuntserver willen beginnen en tegenhouden. Ik heb al geprobeerd om python-scripts uit nodej's te draaien, maar dit gaf problemen met toestemmingen en het is niet ideaal om meerdere talen te gebruiken voor slechts een paar commando's.

For these reasons I want to use https://www.npmjs.com/package/rpi-gpio

Dit is mijn eerste poging om de code naar nodejs te converteren. Ik krijg de foutmelding "Fout: Pin is niet geëxporteerd voor schrijven"

var gpio = require('rpi-gpio');

var Motor1A = 16;
var Motor1B = 18;
var Motor1E = 22;

gpio.setup(Motor1A, gpio.DIR_OUT);
gpio.setup(Motor1B, gpio.DIR_OUT);
gpio.setup(Motor1E, gpio.DIR_OUT);

gpio.write(Motor1A, gpio.HIGH, function(err) {
    if (err) throw err;
    console.log('Written to pin Motor1A');
});

gpio.write(Motor1B, gpio.LOW, function(err) {
    if (err) throw err;
    console.log('Written to pin Motor1B');
});

gpio.write(Motor1E, gpio.HIGH, function(err) {
    if (err) throw err;
    console.log('Written to pin Motor1E');
});

setTimeout(stopMotor_1, 2000);

function stopMotor_1() {
    gpio.write(Motor1E, gpio.LOW, function(err) {
        if (err) throw err;
        console.log('Stopped');
    });
}

tweede poging:

gpio.setup(Motor1A, gpio.DIR_OUT, writeMotor1A);
gpio.setup(Motor1B, gpio.DIR_OUT, writeMotor1B);
gpio.setup(Motor1E, gpio.DIR_OUT, writeMotor1E);

function writeMotor1A(){
  gpio.write(Motor1A, gpio.HIGH, function(err) {
  if (err) throw err;
    console.log('Written to pin Motor1A');
  });
}
function writeMotor1B(){
  gpio.write(Motor1B, gpio.LOW, function(err) {
  if (err) throw err;
    console.log('Written to pin Motor1B');
  });
}
function writeMotor1E(){
  gpio.write(Motor1E, gpio.HIGH, function(err) {
  if (err) throw err;
    console.log('Written to pin Motor1C');
  });
}

resulteert in dezelfde fout 'Fout: Pin is niet geëxporteerd voor schrijven'

Interessant is dat als ik 'gpio-admin exporteer 16' krijg ik de volgende foutmelding:

gpio-admin: could not flush data to /sys/class/gpio/export: Device or resource busy

Hetzelfde commando voor pin 18 en 22 retourneert geen berichten.

Kan iemand me helpen het bovenstaande script naar een nodejs/rpi-gpio-script te converteren? Ik heb geen ervaring om dit in nodejs te doen en ik kan geen goede voorbeelden vinden.

1

2 antwoord

Vanwege de asynch-aard van nodejs, wilt u uw schrijfacties doen door een callback van de setup-functies. Ik denk dat het probeert te schrijven voordat de installatie is voltooid. Een mooi voorbeeld is te vinden in de documentatie van de module hier .

Verandering:

gpio.setup(Motor1A, gpio.DIR_OUT);
gpio.write(Motor1A, gpio.HIGH, function(err) {
if (err) throw err;
  console.log('Written to pin Motor1A');
});

Naar:

gpio.setup(Motor1A, gpio.DIR_OUT, writeMotor1A);
function writeMotor1A(){
  gpio.write(Motor1A, gpio.HIGH, function(err) {
  if (err) throw err;
    console.log('Written to pin Motor1A');
  });
}

Dit zorgt ervoor dat de write niet gebeurt totdat de setup is voltooid en de callback-functie uitvoert.

Merk ook op dat het asynchrone gedrag ervoor zorgt dat alle 3 gpio op "in wezen dezelfde tijd" omhoog gaan. Als u ze een voor een nodig hebt, moet u ze samenvoegen, zodat de voltooiing van writeMotor1A() een aanroep uitvoert die de setup uitvoert voor Motor1B, die een callback naar writeMotor1B() heeft.

1
toegevoegd
bedankt doordringen. Ik krijg nog steeds dezelfde foutmelding. Het python-script werkt onmiddellijk, dus er moet hier iets ontbreken ... iets anders dat ik verkeerd had kunnen doen? Let op de GPIO.setmode (GPIO.BOARD) van de pythonregel - zou het kunnen dat het een niet-bestaande gpio-set betreft? Ik run nodejs niet als root, ik gebruik echter wel github.com/quick2wire/quick2wire-gpio -admin
toegevoegd de auteur christinealittlebit, de bron

Ik ben er zelf aan gaan werken. Er waren twee problemen in mijn geval.

  1. Permissieprobleem: mijn gpio-admin setup werkte niet goed, dus hadden nodejs niet de vereiste rechten om de pinnen te openen. Lopende knoop als sudo loste dit probleem op.
  2. Onjuiste code. Ik gebruikte de waarden gpio.HIGH en gpio.LOW, deze zijn onjuist. De juiste waarden zijn eenvoudig 'waar' of 'onwaar'.

De onderstaande code werkt, waardoor de motor wordt ingeschakeld:

var gpio = require('rpi-gpio');

var Motor1A = 16;
var Motor1B = 18;
var Motor1E = 22;

gpio.setup(Motor1A, gpio.DIR_OUT);
gpio.setup(Motor1B, gpio.DIR_OUT);
gpio.setup(Motor1E, gpio.DIR_OUT);

function forward_engine_1() {
    gpio.write(Motor1A, true, function(err) {
        if (err) throw err;
    });

    gpio.write(Motor1B, false, function(err) {
        if (err) throw err;
    });

    gpio.write(Motor1E, true, function(err) {
        if (err) throw err;
    });
}
1
toegevoegd
Ik had een soortgelijk probleem als 1. Running knooppunt als sudo verholpen mijn probleem (voor nu, tot ik kan uitzoeken wat er mis ging met gpio-admin.) Bedankt een hoop!
toegevoegd de auteur Davie Brown, de bron