東芝から発売されているFlashAirを用いた開発を行う人々向けのまとめwikiです。※本wikiは東芝及びフィックスターズ、キオクシアとは何の関係もありません。お問合わせは管理者へお願いします。

×

概要

また、fa.spiやLuaSPIが実装されていない時期に、Arduinoと通信する手段として考案したソフトSPI実装です。
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>")

Arduino側コード

#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);
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

スマートフォンの方は画面下部よりPC版に切り替えることをおすすめします

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です

広告募集中