W!o+ 的《小伶鼬工坊演義》︰ 一窺全豹之系統設計《實驗》

將要如何追查

若是考以不同『裝置組合』,為什麼『超聲波測距儀』 Ultrasonic Ranger 與『繼電器』 Relay 分接『三、七』可以!但是『二、八』卻不行的呢?

import time
import grovepi

relay = 8

ultrasonic_ranger = 2

grovepi.pinMode(relay,"OUTPUT")

time.sleep(0.1)

grovepi.digitalWrite(relay,1)

time.sleep(0.5)

while True:
    try:

# 因派生二、三『 print 』語法不同之相容寫法。
        print (grovepi.ultrasonicRead(ultrasonic_ranger))

        time.sleep(0.1)

    except IOError:
        print ("Error")

 

。一個簡單如此的程式!又怎麼會出錯的呢?既然是寫 W!o+ 的『小伶鼬工坊演義』,總該採納 Mrphs 是怎麼說的哩!!恍恍惚惚中,或是這麼講的吧︰ W!o+ 認為『單獨』與『共聚』物件情況,有很大的不同。縱使彼此可以排除『干擾性』,還有『同時性』和『共時性』的難題,這大部分發生於『資源性』之競奪領域。若是因『時序性』之問題引起,它在『通訊規範』的設計上尤其重要。大自然春暖花開固然花花無礙,社會上洛陽紙貴可就買不著的了。這些終究還是得用『實驗』來『確立』的事務。……

 

於是努力地嘗試改寫 GrovePi V1.2.5之 韌體,啟動 GrovePi 的Serial  通訊埠,

void setup()
{
# 打開序列通訊埠
    Serial.begin(9600);         // start serial for output
    Wire.begin(SLAVE_ADDRESS);

    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
        attachInterrupt(0,readPulseDust,CHANGE);
}

    //Ultrasonic Read
    else if(cmd[0]==7)
    {
      pin=cmd[1];
      pinMode(pin, OUTPUT);
      digitalWrite(pin, LOW);
      delayMicroseconds(2);
      digitalWrite(pin, HIGH);
      delayMicroseconds(5);
      digitalWrite(pin,LOW);
      pinMode(pin,INPUT);
      dur = pulseIn(pin,HIGH);
      RangeCm = dur/29/2;
      b[1]=RangeCm/256;
      b[2]=RangeCm%256;
# 序列埠輸出傳回值
      Serial.print(b[1]);
      Serial.print(", ");
      Serial.print(b[2]);
      Serial.print(", ");
    }

void receiveData(int byteCount)
{
    while(Wire.available())
    {
      if(Wire.available()==4)
      {
        flag=0;
        index=0;
                run_once=1;
      }
        cmd[index++] = Wire.read();
    }
# 序列埠輸出當下指令
    Serial.print("Command ");
    Serial.println(cmd[0]);
}

 

,以備『實驗』、『探索』、『除錯』之所需。然後用『USB TTL RS232 轉換器』接回樹莓派︰

280_P_1399090698640
Adafruit USB Power Gauge Mini-Kit

139_P_1373091636963
USB TTL RS232 轉換器

後來作者發現 Adafruit 有一款 TTL RS232 界面之迷你的『 USB 埠傳輸功率量測』裝置,如果再加上『USB TTL RS232 轉換器』可以構成一套既便宜又好用的『功率量測』系統。假使輔之以『測試軟體』,可以『自動紀錄』任何一個『 USB 裝置』在各種『工作樣態』下的『功率消耗』。由於它的『量測範圍』可以及於『5V 2A』,因此即使一整個『樹莓派系統』的『消耗功率』大體也可以這麼度量。再者,這個裝置的『資料』輸出格式十分簡單易讀,也就很容易寫『程式』來作『量測數據』處理。在此列出兩種『 USB DVD 讀寫裝置』之『操作狀態』下的消耗功率︰

─── 摘自《音樂播放器之 CD 轉成 mp3《三》上

 

再用『已改寫』的 API 測試,初步之驗證結果如下︰

【在派生二解譯器中執行】

隨意連接五個派生命名裝置

Grove – Rotary Angle Sensorpotentiometer A0

Grove – LED Socket Kitled D5

Grove – Relayrelay D8

Grove – Relaypower D7

Grove – Ultrasonic Rangerultrasonic_ranger D4

# 關閉電源,重新開機。確定 Arduino 在 Hard Reset 狀態。
pi@raspberrypi ~/example python Python 2.7.9 (default, Mar  8 2015, 00:52:26)  [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import grovepi >>> addr = 0x05  # 韌體 Wire 程式庫,如何處理『未下指令』之 I2C 『讀取』  # 位元組讀取 >>> grovepi.read_i2c_byte(addr) 0 # 區塊讀取 >>> grovepi.read_i2c_block(addr) [11, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255] # 長度 32 ? >>> len(grovepi.read_i2c_block(addr)) 32  # Grove - Rotary Angle Sensor 測試。命令 3 >>> potentiometer = 0 # 設定 pinMode 為輸入。命令 5 >>> grovepi.pinMode(potentiometer,"INPUT") 1 # 讀取值 >>> sensor_value = grovepi.analogRead(potentiometer) 0 [11, 2, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255] # 傳回值 >>> sensor_value 703  # Grove - Ultrasonic Ranger 測試。命令 7 >>> ultrasonic_ranger = 4 # 讀取值。命令 3 >>> print grovepi.ultrasonicRead(ultrasonic_ranger) 0 [11, 1, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  452  # 交叉指令 # 命令 3 >>> grovepi.analogRead(potentiometer) 0 [11, 2, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  703 # 命令 3 >>> grovepi.analogRead(potentiometer) 0 [11, 2, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  702 # 命令 7 >>> grovepi.ultrasonicRead(ultrasonic_ranger) 0 [11, 0, 198, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  198 # 命令 7 >>> grovepi.ultrasonicRead(ultrasonic_ranger) 0 [11, 0, 197, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  197 # 命令 3 >>> sensor_value = grovepi.analogRead(potentiometer) 0 [11, 2, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255] >>> sensor_value 703  # Grove - Relay ︰ relay 測試。命令 2 >>> relay=8 # 未設定 pinMode 。輸出無效。命令 2 >>> grovepi.digitalWrite(relay,1) 1 # 設定 pinMode 為輸出。命令 5 >>> grovepi.pinMode(relay,"OUTPUT") 1 # 數位輸出。開。命令 2 >>> grovepi.digitalWrite(relay,1) 1 # 數位輸出。關。命令 2 >>> grovepi.digitalWrite(relay,0) 1  # Grove - LED Socket Kit 測試。PWM 。命令 4 >>> led=5 # 設定 pinMode 為輸出。命令 5 >>> grovepi.pinMode(led,"OUTPUT") 1 # 類比輸出。128。命令 4 >>> grovepi.analogWrite(led,128) 1  # 再次『未下指令』之 I2C 『讀取』 # 位元組讀取 >>> grovepi.read_i2c_byte(addr) 0 # 區塊讀取 >>> grovepi.read_i2c_block(addr) [11, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  # 命令 3 >>> grovepi.analogRead(potentiometer) 0 [11, 2, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  703 # 命令 7 >>> grovepi.ultrasonicRead(ultrasonic_ranger) 0 [11, 0, 198, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  198  # Grove - Relay ︰ power 測試。命令 2 >>> power=7 # 設定 pinMode 為輸出。命令 5 >>> grovepi.pinMode(power,"OUTPUT") 1 # 數位輸出。開。命令 2 >>> grovepi.digitalWrite(power,1) 1 # 命令 7 >>> grovepi.ultrasonicRead(ultrasonic_ranger) 0 [11, 0, 197, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]  197 # 數位輸出。關。命令 2 >>> grovepi.digitalWrite(power,0) 1 >>>  </pre>    <strong><span style="color: #808080;">【與之對應通訊埠的輸出】</span></strong> <pre class="lang:default decode:true">pi@raspberrypi ~ cat /dev/ttyUSB0 
Command 7

0, 198, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, Command 7

1, 194, Command 3

Command 3

Command 3

Command 3

Command 7

0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 197, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, Command 7

0, 194, Command 7

0, 197, 0, 198, 0, 198, 0, 197, 0, 197, 0, 198, 0, 198, 0, 198, 0, 197, 0, 198, 0, 198, 0, 198, 0, 198, 0, 197, Command 7

0, 194, Command 3

Command 3

Command 2

Command 5

Command 2

Command 2

Command 5

Command 4

Command 4

Command 3

Command 3

Command 7

0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, 0, 198, Command 7

0, 194, Command 5

Command 2

Command 7

0, 197, 0, 197, 0, 197, 0, 197, 0, 198, 0, 198, 0, 197, 0, 197, 0, 197, 0, 198, 0, 198, 0, 197, 0, 197, 0, 197, Command 7

0, 194, Command 2