enotionz/gpiO のライブラリを使用して、nodejs でシフトレジスタを制御しようとしています。
ここのライブラリ: https://github.com/EnotionZ/GpiO
何らかの理由でそれを機能させることができません。
期待される結果は、74hc595n シフト レジスタがピン 0 をオンにすることです。シフト レジスタを制御するために特定されたピンは、両方のコード セットで変数として設定されます。
私が開発したpythonコードはうまく機能します:
各ゾーンを循環し、設定にsetShiftRegister(<arr key>)
応じて、有効にする必要がある「ゾーン」が決まると思います。
私はPythonにも実際の例を含めました..
ここに私のjsコードがあります:
var gpio = require('gpio');
var sr_data, sr_clock, sr_latch, sr_oe,
stations = [0,0,0,0,0,0,0,0];
console.log('hello there');
//shift register DS data (GPIO27, PIN 13)
sr_data = gpio.export(13, {
direction: 'out',
ready:function(){ cb('exported sr_data'); }
});
//shift register SH_CP clock (GPIO4, PIN 7)
sr_clock = gpio.export(7, {
direction: 'out',
ready:function(){ cb('exported sr_clock'); }
});
//shift register ST_CP latch pin (GPIO22, PIN 15)
sr_latch = gpio.export(15, {
direction: 'out',
ready:function(){ cb('exported sr_latch'); }
});
//shift register OE output enable, goes to ground (GPIO17, PIN 11)
sr_oe = gpio.export(11, {
direction: 'out',
ready:function(){
cb('exported sr_oe');
sr_oe.set(0);
}
});
setTimeout(function(){
console.log('Enabling SR Pin: ', 0);
//set the latch pin low for as long as we are clocking through the shift register
console.log('-----------------------------------');
//shift pins up using bitwise, i = pin #
setShiftRegister(7);
enableShiftRegisterOutput();
}, 5000);
//set the latch pin high to signal chip that it no longer needs to listen for information
function setShiftRegister(p){
sr_clock.set(0);
sr_latch.set(0);
var num_stations = stations.length;
stations[p] = 1;
console.log('num_stations: ', num_stations);
for (var i = stations.length - 1; i >= 0; i--) {
var station = stations[num_stations-1-i];
console.log('SR PIN: ' + (num_stations-1-i) + ' STATION ARR ID: ' + i + ' STATION VALUE: ' + station);
sr_clock.set(0);
//sets pin to high or low depending on pinState
sr_data.set(station);
//register shift bits on upstroke of clock pin
sr_clock.set(1);
}
sr_latch.set(1, function(){
console.log('latch set');
});
}
function enableShiftRegisterOutput(){
sr_oe.set(1, function(){
cb('enabling shift register');
});
}
function cleanup(){
sr_clock.unexport();
sr_data.unexport();
sr_latch.unexport();
sr_oe.unexport();
console.log('pin cleanup done');
}
function cb(message){
console.log(message);
}
// function setShiftRegister(srvals, zones, cb){
// GPIO.write(pin_sr_clk, false);
// GPIO.write(pin_sr_lat, false);
// for (var i = zones.length - 1; i >= 0; i--) {
// console.log('zones.length: ', zones.length);
// console.log('i: ', i);
// var zone = zones[i];
// GPIO.write(pin_sr_clk, false);
// GPIO.write(pin_sr_dat, srvals[zones.length - 1 - i]); //have to decrement result by 1 as Shift Register Gate starts at 0
// GPIO.write(pin_sr_clk, true);
// };
// GPIO.write(pin_sr_lat, true);
// cb();
// }
// setShiftRegister(srvals, zones);
これは動作するpythonコードです
import RPi.GPIO as GPIO
import atexit
#GPIO PIN DEFINES
pin_sr_clk = 4
pin_sr_noe = 17
pin_sr_dat = 27 # NOTE: if you have a RPi rev.2, need to change this to 27
pin_sr_lat = 22
# NUMBER OF STATIONS
num_stations = 8
# STATION BITS
values = [0]*num_stations
def enableShiftRegisterOutput():
GPIO.output(pin_sr_noe, False)
def disableShiftRegisterOutput():
GPIO.output(pin_sr_noe, True)
def setShiftRegister(values):
GPIO.output(pin_sr_clk, False)
GPIO.output(pin_sr_lat, False)
for s in range(0,num_stations):
print num_stations-1-s
print values[num_stations-1-s]
GPIO.output(pin_sr_clk, False)
GPIO.output(pin_sr_dat, values[num_stations-1-s])
GPIO.output(pin_sr_clk, True)
GPIO.output(pin_sr_lat, True)
def run():
GPIO.cleanup()
# setup GPIO pins to interface with shift register
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin_sr_clk, GPIO.OUT)
GPIO.setup(pin_sr_noe, GPIO.OUT)
disableShiftRegisterOutput()
GPIO.setup(pin_sr_dat, GPIO.OUT)
GPIO.setup(pin_sr_lat, GPIO.OUT)
values[0]=1 #this is the equivalent of setting array key 0 = 1 (or true)
print values
setShiftRegister(values)
enableShiftRegisterOutput()
def progexit():
global values
values = [0]*num_stations
setShiftRegister(values)
GPIO.cleanup()
if __name__ == '__main__':
atexit.register(progexit)
run()