94451
Goto Top

Mit SPI-Schnittstelle Komunizieren über Node.js

Hi,

ich habe auf meinen Raspberry (3 mit neusten Jessie Lite) Node.js installiert (für HTTP habe ich auch noch Socket.io drauf). Ich will jetzt aber meine ADCs und meine "zusätzlichen" GPIOs über i2c ansprechen...
dafür habe ich auch schöne C-Programme, aber wie schaffe ich jetzt eine verbindung zwischen den node.js und der i2c schnittstelle...

gibt es eine Möglichkeit mit Javascript direkt auf die Hardware zuzugreifen? Wie kann man das "effizient" bewältigen? Ich weiß es gibt viele "fertige" tools, aber die meisten sind eher confus und unübersichtlich und mir zu aufgebläht für meinen verwendungszweck...

in erster Linie will ich 3 dinge tun
1. GPIO Schalten -> also der node.js Server soll einzelne Ports ansprechen... <- nicht die localen GPIOs sondern welche ich über i2c angeschlossen habe (könnte aber auch ein kleines C sein das ich einfach aufrufe: gpio 12 1 [für Port 12 ein])
2. GPIO Lesen -> sobald sich ein gpio verändert soll dies mein node.js Server erfahren
3. ADC Lesen -> auch hier sollen "Änderungen" an den Server geschickt werden.

für alle 3 Anwendungen habe ich bereits n kleines c-Tool... das mir in die Konsole (bzw. beim schreiben über die Konsole) die Informationen ausliest...

welche effiziente Möglichkeit habe ich jetzt diese "tools" zu verbinden und WIE ... oder kann ich das sogar direkt im js machen???
Wie bereits oben erwähnt, möchte ich möglichst Abstand von aufgeblähten Lösungen nehmen...

Diesen "Testserver" habe ich online gefunden... die "Einfachheit" mag ich sehr face-smile <- auch wenn ich hier noch einiges dazu bauen muss / will ist das erstmal eine "GRUNDFUNKTION" jetzt soll eben eigentlich nur eingebaut werden => Schicke ADC/GPIO-Daten und Schalte GPIO-Ports
var http = require('http');
   
var app = http.createServer(function(req, res) {
   console.log('createServer');  
});
app.listen(3000); 
   
var io = require('/usr/local/lib/node_modules/socket.io').listen(app);   
   
   
io.on('connection', function(socket) {
    io.emit('Server 2 Client Message', 'Welcome!' ); 
   
    socket.on('Client 2 Server Message', function(message) {   
	console.log(message);    
	io.emit('Server 2 Client Message', message.toUpperCase() );//upcase it
   
    }); 
   
});  


Vielen Dank für howtos und tipps

gruß RoadRunner

Content-Key: 315133

Url: https://administrator.de/contentid/315133

Printed on: April 19, 2024 at 18:04 o'clock

Mitglied: 129813
129813 Sep 13, 2016 updated at 11:43:37 (UTC)
Goto Top
https://github.com/fivdi/i2c-bus
or
für alle 3 Anwendungen habe ich bereits n kleines c-Tool... das mir in die Konsole (bzw. beim schreiben über die Konsole) die Informationen ausliest...
Execute these progs with a child process and read result on stdout
https://nodejs.org/api/child_process.html

Regards
Mitglied: 94451
94451 Sep 13, 2016 at 15:43:13 (UTC)
Goto Top
Hi,

kennt jemand (lauffähige) beispiele für die child_processes (auf dem pi)?
https://nodejs.org/api/child_process.html
Mitglied: 129813
129813 Sep 13, 2016 updated at 16:05:35 (UTC)
Goto Top
There are so many examples out there
http://stackoverflow.com/questions/30134236/use-child-process-execsync- ...

You should read the documentation and learn (there are also examples in the doc), instead of copy n paste face-wink, a raspi is just another linux box, so nothing special for node.js.
Mitglied: 94451
94451 Sep 13, 2016 at 16:32:18 (UTC)
Goto Top
das meine ich nicht...
ich suche ein "Konzept". Ich frage hier im Forum, weil mir das "wühlen" in 1000 Datenblättern zu viel Zeit kostet... und viele hier einfach genug Ahnung haben um einen guten Tipp zu geben...

=> ich hab mir die Seite (https://nodejs.org/api/child_process.html) angeschaut und es ist auch kein problem eine exec auszuführen um den wert zurück zu geben...

aber ich suche ja (im Beispiel ADC), nach einen kontinuehrlichen "STREAM" ...
beispiel C-File ./test
var i = 1;
while(1){
    clearscreen();
    printf("%i", i++);  
    usleep(500000); 
}

Hier wird mir "Kontinuierlich" ein Wert ausgegeben...
diesen möchte ich jetzt mit Node einfangen!

const ex = require('child_process');  
ex.execSync('./test', (error, stdout, stderr) => { //selber Fehler mit exec  
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log( stdout );
});
bekomme keine Daten, weil mein C ja noch nicht fertig ist...

<- das ./test aber ständig öffnen ist wohl nicht die effektivste Lösung
Mitglied: 94451
94451 Sep 13, 2016 at 16:58:41 (UTC)
Goto Top
Die nächste Frage ist wie mach ich eine "Asynchrone" Übertragung zwischen meinen ADCs und und node.js

=> also wie muss ich mein c Bauen, dass ich nur Daten "erzeuge" bzw. "übertrage" wenn auch welche da sind...

im c habe ich einen eine einfache Funktion namens readADC(1) (womit ich dann Pin 1 einlese)... der Wert ist auf 53 und wurde bereits von node.js empfangen...
Wie kann ich nur übertragen (oder von node holen) wenn was anderes als 53 kommt?

Dank
Mitglied: 129813
Solution 129813 Sep 13, 2016 updated at 18:15:05 (UTC)
Goto Top
bekomme keine Daten, weil mein C ja noch nicht fertig ist...
For this are the asynchronus exec functions (same page).
https://nodejs.org/api/child_process.html#child_process_asynchronous_pro ...

Simply subscribe the data event, which continuously handles output for your command.
Mitglied: 94451
94451 Sep 13, 2016 at 18:13:02 (UTC)
Goto Top
konnte es vorerst lösen!

danke