輕鬆實現PC與Arduino/樹莓派的無線溝通 – 以會議簡報器為例
Description
2018-07-13
作者:chtseng
前言
之前曾介紹過如何在不使用開發板的情況下,僅透過SunplusIT的一對一 RF Uart模組就能製作的簡報器(請參考使用MUART0-S-1-1打造一支多功能會議簡報器),雖然超easy,但可惜有個讓人覺得不太方便的限制,就是它必須使用「連續按兩下」的動作來實現「回上一頁」的功能,這是由於PC與簡報器之間傳遞的只有 MUART0-S-1-1 IO port的ON/OFF訊息,PC端依據是否連續click來區分上一頁或下一頁。此時這個問題便出現了:每個人對於「連續按兩下」的定義不同…有的人慢條斯理的輕按,有的人急驚風般的狂按,於是,上次製作的簡報器很快的便棄置一旁,我又回到人肉簡報器的日子。
這次捲土重來,在簡報器端多了一片Arduino Mini Pro開發板,PC接收端則維持不變,仍為一片RF Uart模組加上USB 2 TTL,整個架構修改如下:
如此一來,雖然多了一片Arduino,但由於Arduino與PC之間可定義各種傳輸內容,因此功能與使用方便性上可是增進不少,除了基本的雷射光點及上下頁功能,我們還可以在簡報筆上定義各種無限的想像,例如:
- 語音功能:可提醒開會中打瞌睡的人員注意一下。
- 計時功能:自動統計講者所報告的時間。
- 焦點功能:將螢幕放大或加亮轉暗等等。
開始製作:
A)準備材料
下方的材料總共不超過$500哦。
- 雷射光頭 $65 x1 https://www.icshop.com.tw/product_info.php/products_id/13180
- SunplusIT MUART0-S-1-1 $125 x1 https://www.icshop.com.tw/product_info.php/products_id/25724
- Arduino Mino Pro $70 x1 https://www.icshop.com.tw/product_info.php/products_id/25139
- SunplusIT MUART0-S-1-1 x1 http://www.sunplusit.com/TW/Shop/IoT
- USB轉TTL $115 x1 https://www.icshop.com.tw/product_info.php/products_id/25086
- 按壓開關 $15 x3 https://www.icshop.com.tw/product_info.php/products_id/22372
B)配線及組裝
PC端:
只要將USB2TTL模組與MUART0-S-1-1相互對接,我們就完成了USB轉RF的功能了,只要在程式中定義好Serial埠號,就可以透過無線方式實現PC與Arduino開發板之間的資訊傳遞,多方便啊!
簡報器端:
按鈕加上10K電阻避免pin腳的輸入噪音(您也可以直接使用Arduino內建的20K上拉Pull-up電阻,感謝楊樹人網友指正)。
簡報器case模型。
下載:https://github.com/ch-tseng/Powerpoint-Pointer/blob/master/3D/pointer.stl
簡報器組裝:
下圖,將所有的模組裝置固定於下盒中即完成。
C)程式
PC端:
PC端的Python程式透過USB2TTL接收來自簡報筆裝置所發出的訊息,若為D或N ,則透過PyAutoGUI模組,對mouse或keyboard進行相對應的控制。
- D → 表示下一頁
- U→ 表示上一頁
- N → 表示執行自訂的功能(如本範例程式中為撥放一個wav語音檔)
# -*- coding: utf-8 -*-
comPort = “com29″ #PC的TTL2USB port baudRate = 9600 import serial import pyautogui import sys import time import playsound import random serial = serial.Serial(comPort, baudRate) i = 0 nowtime = 0 lastClicktime = 0 while True: nowtime = int(round(time.time() * 1000)) out = “
while(serial.inWaiting()): out += str(serial.read(1).decode(‘UTF-8’))
if out != “: print(out) if(out==”D”): pyautogui.typewrite([“right”, “ctrlright”]) if(out==”U”): pyautogui.typewrite([“left”, “ctrlleft”]) if(out==”N”): file = “notice” + str(random.randrange(1, 6)) + “.wav” playsound.playsound(file, True) serial.flushInput() |
程式中所定義的COM port,代表USB2TTL所使用的COM埠號,當您把USB2TTL接到PC之後,可由裝置管理員中找到該裝置所對應的port number。例如下圖中,可由裝置管理員中找到USB2TTL的COM埠號為com29,把此值填入comPort變數即可。
簡報筆端:
請參考下方程式。delayTime為連續按鍵之間的delay時間,您可以調整該值以取得切換上下頁時的最佳手感。
#include <SoftwareSerial.h>
SoftwareSerial Serial1(2, 3); // RX, TX byte pinNotify = 5; byte pinUp = 8; byte pinDown = 9; unsigned int delayTime = 500; boolean notifyState = 0; boolean upState = 0; boolean downState = 0; void setup() { Serial.begin(9600); Serial1.begin(9600); pinMode(pinUp, INPUT); pinMode(pinDown, INPUT); } void loop() { notifyState = digitalRead(pinNotify); upState = digitalRead(pinUp); downState = digitalRead(pinDown); if ( notifyState == 1) { Serial.println(“Notice”); Serial1.write(‘N’); delay(delayTime); Serial1.flush(); } if (upState == 1) { Serial.println(“Up”); Serial1.write(‘U’); delay(delayTime); Serial1.flush(); } if (downState == 1) { Serial.println(“Down”); Serial1.write(‘D’); delay(delayTime); Serial1.flush(); } } |
測試使用
搭配了凌陽創新的長距離傳輸且穩定的RF模組,使得PC與Arduino之間的資訊傳輸變得再簡單不過了,再調整相關程式參數到最佳狀態,讓這個簡報器使用起來的滑順度可不輸市面上其它款的簡報器哦,此外我們還可依照需求,增加按鍵或修改程式來實現各種自訂的附加功能,比如,目前簡報器最流行的、只有重點區域維持亮度其它變暗的「焦點」功能,您要不要馬上來試看看?
Contact
- CategoryArduino, Raspberry Pi, 開發板
Project簡述
- 簡述之前曾介紹過如何在不使用開發板的情況下,僅透過SunplusIT的一對一 RF Uart模組就能製作的簡報器,雖然超easy,但是它必須使用「連續按兩下」的動作來實現「回上一頁」的功能,此時這個問題便出現了:每個人對於「連續按兩下」的定義不同…有的人慢條斯理的輕按,有的人急驚風般的狂按,於是,上次製作的簡報器很快的便棄置一旁,我又回到人肉簡報器的日子。這次捲土重來...