また、fa.spiやLuaSPIが実装されていない時期に、Arduinoと通信する手段として考案したソフトSPI実装です。
PWMもPIO直接叩けば早くなったし、こっちもやる価値あるんじゃね?ということで、
出来る限り操作回数が少なくなるよう調整して作ってみました。103.4[Byte/sec]と約3倍の速度になりました。
PWMもPIO直接叩けば早くなったし、こっちもやる価値あるんじゃね?ということで、
出来る限り操作回数が少なくなるよう調整して作ってみました。103.4[Byte/sec]と約3倍の速度になりました。
function send_spi(DATA)
fa.pio(PIO_MODE,1)
for i=0,8 do
if bit32.btest(DATA,1) then
fa.pio(PIO_MODE,2)
fa.pio(PIO_MODE,18)
else
fa.pio(PIO_MODE,0)
fa.pio(PIO_MODE,16)
end
DATA = bit32.rshift (DATA, 1)
end
fa.pio(PIO_MODE,0)
end
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);
}

コメントをかく