また、fa.spiやLuaSPIが実装されていない時期に、Arduinoと通信する手段として考案したソフトSPI実装です。
spi.lua?DATA
という感じで、GETで渡されたデータをソフトSPI的な感じで送信します。約31.2[Byte/sec]しか出ません。
Lib:pioduino?を内蔵して使っています。
spi.lua?DATA
という感じで、GETで渡されたデータをソフトSPI的な感じで送信します。約31.2[Byte/sec]しか出ません。
Lib:pioduino?を内蔵して使っています。
PIO_MODE = 0x00 --ピン入出力変数(触らないこと)
PIO_DATA = 0x00 --ピン状態変数(触らないこと)
HIGH = 0x1 --定数
LOW = 0x0 --定数
INPUT = 0x0 --定数
OUTPUT = 0x1 --定数
function delay(t)
sleep(t)
end
function digitalWrite(port,dat)
local mask = bit32.lshift(1,port)
local nmask = bit32.bnot (mask)
if(dat == LOW) then
PIO_DATA = bit32.band(PIO_DATA, nmask)
else
PIO_DATA = bit32.bor(PIO_DATA, mask)
end
return fa.pio(PIO_MODE,PIO_DATA)
end
function digitalRead(port)
local PIO_STATUS = 0
local mask = bit32.lshift(1,port)
PIO_STATUS, PIO_INFO = fa.pio(PIO_MODE, PIO_DATA)
if(bit32.btest (PIO_INFO,mask)) then
return HIGH, PIO_STATUS
end
return LOW, PIO_STATUS
--(IF文や他の関数に直接突っ込めるよう、第一引数にポート状態を置いてある)
end
function pinMode(port,mode)
local mask = bit32.lshift(1,port)
local nmask = bit32.bnot (mask)
if (mode == OUTPUT) then
PIO_MODE = bit32.bor(PIO_MODE, mask)
else
PIO_MODE = bit32.band(PIO_MODE, nmask)
end
return fa.pio(PIO_MODE,PIO_DATA)
end
dW = digitalWrite
dR = digitalRead
pM = pinMode
function send_spi(DATA)
digitalWrite(MOSI,0)
digitalWrite(MOSI,1)
digitalWrite(MOSI,0)
for i=0,8 do
if bit32.btest(DATA,1) then
digitalWrite(MISO,1)
else
digitalWrite(MISO,0)
end
digitalWrite(CS,1)
digitalWrite(CS,0)
DATA = bit32.rshift (DATA, 1)
end
end
pinMode(MOSI ,OUTPUT)
pinMode(MISO ,OUTPUT)
pinMode(CS ,OUTPUT)
print("HTTP/1.1 200 OK\n\n")
print("<HTML>")
if not arg[1] then
s=""
else
s = arg[1]
end
print(s)
ls = string.len(s) - 1 --なぜかarg[1]の末端には0x0Aがくっつくのでそれ削除
print("<br>")
for i=1,ls do
code = string.byte(s, i)
send_spi(code)
print(code)
end
print("OK")
print("</HTML>")
#include <SoftwareSerial.h>
SoftwareSerial ss(7, 8); // RX, TX
void setup()
{
#define MOSI 11
#define MISO 12
#define CS 4
Serial.begin(115200);
pinMode(3,INPUT); //LED_R
pinMode(4,INPUT); //CS
pinMode(5,INPUT); //LED_G
pinMode(6,INPUT); //LED_B
//Arduino Uno
pinMode(11,INPUT); //MOSI(SW1);
pinMode(13,INPUT); //SCK
// DO NOT TOUCH!!
// DO NOT TOUCH!!
pinMode(12,INPUT); //MISO(絶対入力!);
// DO NOT TOUCH!!
// DO NOT TOUCH!!
ss.begin(9600);
}
void loop()
{
while(digitalRead(MOSI) != LOW);
while(digitalRead(MOSI) != HIGH);
while(digitalRead(MOSI) != LOW);
byte dat = 0;
for(int i=0;i<8;i++)
{
dat >>= 1;
while(digitalRead(CS) != HIGH);
if(digitalRead(MISO) == HIGH)
dat |= 0x80;
while(digitalRead(CS) != LOW);
}
ss.write(dat);
// Serial.print("DAT:");
// Serial.println(dat,HEX);
}

コメントをかく