TI-Nspire & Arduino アナログ入力を使う 1、矢継ぎ早にデータを読み取る

参考:
ASI Connection Listener - ticalc.org
ASI Temperature - ticalc.org

ポテンショメーターとして SoftPot を使う。とにかく矢継ぎ早にデータを読み取る。
f:id:ti-nspire:20160724090823p:plain:w400

画面の数字はアナログ入力電圧の AD 変換値(0 ~ 1023)。


.ino

#define sensorPin 5

void setup() {
   Serial.begin(115200);
}

void loop() {
   if(Serial.available() > 0) {
      char c = Serial.read();
      switch(c) {
         case 'T':
            Serial.print(analogRead(sensorPin));
            break;
         default:
            Serial.print('0');
      }
   }
}


.lua

-- 矢継ぎ早にアナログデータを読み取る。
require "asi" require "color"
platform.window:setBackgroundColor(color.dodgerblue)

function on.resize() 
   W, H = platform.window:width(), platform.window:height()
   fontSize = W/13.25
end

PORT = nil
DATA = 0

-------------------------------------------------------------------
-- シリアルデータの読み取り要求函数(合図として文字 "T" を送信する)
-------------------------------------------------------------------
function requestData()
   if PORT then
      PORT:write('T')
      PORT:read()
   end
end

--------------------------------------------------------------------------------
-- ASI ステートリスナーを定義する(ASI の準備が整ったらポートスキャンを開始する)
--------------------------------------------------------------------------------
function stateListener(state) 
   if state == asi.ON then 
      asi.startScanning(portScanner)
   end
end

----------------------------------------------------------------
-- ポートスキャナーを定義する(見つかったポートに接続要求を出す)
----------------------------------------------------------------
function portScanner(port) 
   port:connect(portConnector) 
end

-----------------------------------------------------------------------------------------------------
-- ポートコネクターを定義する
-----------------------------------------------------------------------------------------------------
function portConnector(port, event)  
   PORT = port
   if event == asi.CONNECTED then
      asi.stopScanning()
      requestData() 
      port:setReadListener(readListener)
   elseif event == asi.DISCONNECTED then 
      DATA = 0  
      asi.startScanning(portScanner)
      platform.window:invalidate()
   end 
end

----------------------------------------------------------------------------
-- 読み取りリスナーを定義する(データを取得し、またデータ読み取り要求を出す) 
----------------------------------------------------------------------------
function readListener(port)
   local data = port:getValue()  
   if data then 
      DATA = data 
   else
      DATA = 0
   end
   platform.window:invalidate()
   requestData() 
end

---------------------------------
-- ASI ステートリスナーを登録する
---------------------------------
function on.construction() 
   asi.addStateListener(stateListener)
end

-------------------------------------------------------------------------------
function on.paint(gc)
   gc:setFont("sansserif", "r", fontSize)
   gc:setColorRGB(color.white)
   gc:drawString("  "..DATA, 0, 0)
   gc:fillRect(0, H/2, W*(tonumber(DATA) or 0)/1023, H/5)   
end