PCF8591 AD-Kanäle via Javascript auf node.js auslesen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich bin neu im Forum - sorry wenn ich etwas falsch mache;

    --------------------------------------------------------------------------------------------
    ich habe folgendes Setup:
    - Raspberry Pi 4
    - PCF8591 über i2c angeschlossen
    - node.js installiert - funktioniert ohne Probleme
    - verschiedene javascripte für verschiedene Sensoren habe ich am laufen

    --------------------------------------------------------------------------------------------
    ich möchte folgendes tun:
    - die vier ADC-Kanäle des AD-Wandlers PCF8591 mittels javascript auslesen, script läuft dann auf node.js server

    --------------------------------------------------------------------------------------------
    folgendes Befehle über die command shell funktionieren:
    pi@raspberrypi:~/rswebserver/public/main/gpio_test $ i2cget -y 1 0x48 0
    0x7a
    pi@raspberrypi:~/rswebserver/public/main/gpio_test $ i2cget -y 1 0x48 1
    0x7a
    pi@raspberrypi:~/rswebserver/public/main/gpio_test $ i2cget -y 1 0x48 2
    0xa5
    pi@raspberrypi:~/rswebserver/public/main/gpio_test $ i2cget -y 1 0x48 3
    0xb2

    240407
    ServoMotor.VCC PCF8591.AN0 0x80 128 --> 2,5 V
    IRSensor.Sig PCF8591.AN1 0x7a 122 --> 2,4 V
    Pi.3.3V PCF8591.AN2 0xa1 161 --> 3,2 V
    notConnected PCF8591.AN3 0x83 131 --> 2,6 V

    --------------------------------------------------------------------------------------------
    ein entsprechender Python Code läuft auch ohne Probleme;

    --------------------------------------------------------------------------------------------
    ich bekomme den folgenden Javascript Code nicht ans laufen:
    - anscheinend werden die ADC-Kanäle nicht umgeschaltet - ich bekomme immer denselben Wert ausgelesen;

    var i2c = require('i2c-bus');

    var PCF8591_ADDR = 0x48;
    var PCF_REG = 0x00;
    var PFC_LENGTH = 0x01;
    const CHANNEL_1 = 0x40;
    const CHANNEL_2 = 0x41;
    const CHANNEL_3 = 0x42;
    const CHANNEL_4 = 0x43;

    var i2c1 = i2c.openSync(1);
    console.log("step 1")

    i2c1.writeByteSync(PCF8591_ADDR, PFC_LENGTH, CHANNEL_1);

    var rawData = i2c1.readByteSync(PCF8591_ADDR, PCF_REG);

    console.log("data: " + rawData);
    i2c1.closeSync();

    --------------------------------------------------------------------------------------------
    ich habe jetzt zwei Tage im

    - Internet gesucht und verschiedene Ansätze ausprobiert,

    - verschiedene npm libraries ausprobiert und

    - Google Gemini abgefragt

    - im Anhang PFC8591_Versuche.txt findet Ihr meine Ansätze

    aber es klappt einfach nicht;


    vielleicht könntet Ihr mir helfen und sagen was ich falsch mache oder einen Tip geben wo ich noch suchen kann;

    vielen Dank im Voraus für eure Hile;

    Mit freundlichen Grüßen
    Rudolf

  • PCF8591 AD-Kanäle via Javascript auf node.js auslesen? Schau mal ob du hier fündig wirst!

  • Ich fürchte, Du bist Opfer der (Mehrbenutzer-) Dateirechte.

    Die Lese-/Schreibrechte auf die i2c-Gerätedateien werden Dir mit < ls -al /dev/i2* > angezeigt.

    Gerätedateien (Device Files) werden im Regelfall über die Gruppenrechte gelesen/beschrieben.

    Wenn Du als User pi ein Shell Kommando ausführst, machst Du das auch als Mitglied der Gruppe i2c, siehe Konsolenausgabe von < id >

    Welcher User aber Dein Javascript auf node.js ausführt weiß ich nicht. Der betreffende User sollte in die Gruppe i2c aufgenommen werden.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo RTFM, TE,

    vielen Dank für euer Feedback;

    RTFM:
    - ich habe die verschiedenen Rechte versucht gleich zu schalten (sudo chmod 777);
    - wenn ich "i2cget -y 1 0x48 1" in der cmd shell ausführe, muß ich das Kommando meistens zweimal ausführen um einen geänderten Wert zu bekommen;
    - an ad-channel 1 hängt ein IR-Sensor;
    - das oben aufgeführte js funktioniert immer noch nicht;
    - ich habe jetzt einen neuen Anlauf mit folgendem js gemacht:
    exec("i2cget -y 1 0x48 1", (error, stdout, stderr) => {
    if (error) {
    console.log(`error: ${error.message}`);
    return;
    }
    if (stderr) {
    console.log(`stderr: ${stderr}`);
    return;
    }
    var Vr = (3.3 * stdout) / 255;
    console.log("ad channel 2: "+ Vr.toFixed(2) + " V");
    console.log(`stdout: ${stdout}`);
    console.log("--------------------------------------------");
    var dis_1 = 0
    if ( ((0.051 * Vr) - 0.014) > 0){
    dis_1 = 1 / ((0.051 * Vr) - 0.014)
    }
    var dis_2 = 29.988 * Math.pow(Vr, -1.173);
    var dis = (dis_1 + dis_2) / 2
    dis = Math.round(dis,1)
    console.log (dis_1 + " | " + dis_2 + " | " + dis + " cm");
    });

    - prinzipiell funktioniert es - ich habe nur das problem, daß ich das script mehrmals ausführen muss, um geänderten AD-Wert zu erhalten;
    - meistens muss ich auch vorher in der cmd shell "i2cget -y 1 0x48 1" vorher zweimal ausführen und dann das js --> dann erhalte ich einen geänderten AD-Wert;
    - das js führe ich mit "sudo node PCF8591.js" in der cmd shell aus;


    @TE:
    - ich habe leider deine Anmerkungen nicht verstanden - ich habe nicht verstanden wo ich das js anpassen soll;

    vielen Dank euch beiden für eure Hilfe;

    Mit freundlichen Grüßen
    Rudolf

  • const exec = require("child_process").exec;

    exec("i2cget -y 1 0x48 1", (error, stdout, stderr) => {
    if (error) {
    console.log(`error: ${error.message}`);
    return;
    }
    if (stderr) {
    console.log(`stderr: ${stderr}`);
    return;
    }
    var Vr = (3.3 * stdout) / 255;
    console.log("ad channel 2: "+ Vr.toFixed(2) + " V");
    console.log(`stdout: ${stdout}`);
    console.log("--------------------------------------------");
    var dis_1 = 0
    if ( ((0.051 * Vr) - 0.014) > 0){
    dis_1 = 1 / ((0.051 * Vr) - 0.014)
    }
    var dis_2 = 29.988 * Math.pow(Vr, -1.173);
    var dis = (dis_1 + dis_2) / 2
    dis = Math.round(dis,1)
    console.log (dis_1 + " | " + dis_2 + " | " + dis + " cm");
    });

  • var i2c = require('i2c-bus');

    var PCF8591_ADDR = 0x48;
    var PCF_REG = 0x00;
    var PFC_LENGTH = 0x01;
    const CHANNEL_1 = 0x40;
    const CHANNEL_2 = 0x41;
    const CHANNEL_3 = 0x42;
    const CHANNEL_4 = 0x43;

    var i2c1 = i2c.openSync(1);
    console.log("step 1")

    i2c1.writeByteSync(PCF8591_ADDR, PFC_LENGTH, CHANNEL_1);

    var rawData = i2c1.readByteSync(PCF8591_ADDR, PCF_REG);

    console.log("data: " + rawData);
    i2c1.closeSync();


  • - ich habe die verschiedenen Rechte versucht gleich zu schalten (sudo chmod 777);

    Damit kann das Script nur von Jedermann gelese, geschrieben (=gelöscht) und ausgeführt werden.

    Wird im ablaufenden Script ein Device File gelesen/beschrieben, gelten dessen Dateirechte.

    Zeige einmal die Ausgebe von < ls -al /dev/i2* > her. Siehe #2

    RTFM = Read The Factory Manual, oder so

  • Hallo RTFM;

    aktuell ausgelesen:
    ls -al /dev/i2*
    crw-rw---- 1 root i2c 89, 1 Apr 8 08:18 /dev/i2c-1

    wobei mich die Ausgabe etwas irritiert da ich die Rechte mit folgender Zeile geändert hatte:
    sudo chmod 777 i2c-1
    ich habe die Änderung noch einmal durchgeführt
    ls -al /dev/i2*
    crwxrwxrwx 1 root i2c 89, 1 Apr 8 11:28 /dev/i2c-1

    wenn ich dann allerdings den Pi neu starte erhalte ich wieder:
    ls -al /dev/i2*
    crw-rw---- 1 root i2c 89, 1 Apr 8 08:18 /dev/i2c-1

    Mit freundlichen Grüßen

    Rudolf

  • Hallo,

    update:
    - ich habe den Code in einen file PCF8591.js kopiert
    - ls -al PCF8591.js
    ==> -rwxrwxrwx 1 pi pi 12447 Apr 8 11:50 PCF8591.js

    - ls -al /dev/i2*
    ==> 0 crw-rw---- 1 root i2c 89, 1 Apr 8 11:51 /dev/i2c-1

    - sudo node PCF8591.js ==>
    CHANNEL_1: rawData = 141 | Vr = 1.82 V
    12.648621300278274 | 14.810450303417422 | 14 cm

    wenn ich den Abstand zum Target ändere erkennt die Software den Abstand einwandfrei;
    allerdings muß ich das js zweimal ausführen, um den korrekten Wert zu erhalten;

    beim ersten Lesen, erhalte ich den alten Wert;

    übersehe ich hier vielleicht noch etwas?

    vielen Dank im Voraus für eure Hilfe;

    Mit freundlichen Grüßen
    Rudolf

    PCF8591.js:

  • Hallo,

    ich habe folgende Änderung vorgenommen und jetzt scheint alles zu funktionieren:

    Code
    var rawData = i2c1.readByteSync(PCF8591_ADDR, CHANNEL_1);
    rawData = i2c1.readByteSync(PCF8591_ADDR, CHANNEL_1);

    sollte ich aus eurer Sicht noch etwas beachten?

    Mit freundlichen Grüßen
    Rudolf

  • Weder "chmod 777", noch "sudo node" sind Problemlöser, sondern schaffen (später) mehr Probleme, als Dir lieb ist.

    Aber solange nur ein User (pi) sich anmelden kann, kannst Du Dein Würgaround so lassen. Ich habe jedenfalls keine Lust die Dateirechte jedem persönlich von der Pike auf zu erklären. [oder wie der User www-data i2c-Gruppenrechte erhält]


    Servus !

    RTFM = Read The Factory Manual, oder so

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!