我可以從 Flash 控制 Arduino,它對我來說作業正常,但我需要讓它反轉,如果我按下閃光燈中的按鈕(pin13),我需要從 Arduino 控制閃光燈,它會 gotoAndStop Frame(2)或( 1)。請幫忙謝謝
這是所有源檔案 https://drive.google.com/file/d/1PvoD41Is8_gcl5bJpVWlhqtvre3twENK/view?usp=sharing
作業視頻 https://drive.google.com/file/d/15Z2onMf301p5DHEFhetYEXKrjMQAKAWP/view?usp=sharing
Arduino連接代碼作業正常
import flash.net.Socket;
var _socket:Socket = new Socket();
var _proxyAddress:String = "127.0.0.1";
var _proxyPort:uint = 5331;
_socket.addEventListener(Event.CONNECT, onConnect);
_socket.connect(_proxyAddress, _proxyPort);
function onConnect(event:Event):void{
trace("Socket Connected");
}
打開和關閉 Arduino 的 Flash 代碼
Frame 1
MovieClip(root)._socket.writeUTFBytes("f");
MovieClip(root)._socket.flush();
Frame 2
MovieClip(root)._socket.writeUTFBytes("n");
MovieClip(root)._socket.flush();
閃光按鈕代碼
onBtn.addEventListener(MouseEvent.MOUSE_DOWN,btn1);
function btn1(evt:MouseEvent):void
{
gotoAndStop(1);
}
offBtn.addEventListener(MouseEvent.MOUSE_DOWN,btn2);
function btn2(evt:MouseEvent):void
{
gotoAndStop(2);
}
Arduino代碼
#define BULB 13
int incoming = LOW;
void setup(){
Serial.begin(57600);
Serial.println("INITALIZING");
pinMode(BULB, OUTPUT);
Serial.println("READY");
}
void loop(){
if(Serial.available () > LOW ){
incoming = Serial.read();
if(incoming == 'n'){
digitalWrite(BULB, LOW);
}
else if(incoming == 'f'){
digitalWrite(BULB, HIGH);
}
}
}
uj5u.com熱心網友回復:
自從我使用 actionscript 已經十多年了,我不再擁有 Flash 許可證,所以很遺憾我將無法復制您的設定。
話雖如此,我可能有一些希望有幫助的建議:
仔細檢查 serproxy.cfg 是否正確配置。COM4您的 serproxy.cfg 檔案配置為通過 Windows 在埠上使用 baudrate連接到 Arduino 57600。再檢查一遍:
- 埠和波特率匹配
- 設備通過 USB 連接
- 該埠在 Arduino 的串行監視器(或其他讀取/寫入同一 COM 埠的工具)中不忙/已經打開
當我上次使用 serproxy 時,我使用的是 OSX 并且必須配置serial_device而不是comm_ports. 不是 100% 確定這會起作用,但如果 COM4 確實是您的 Arduino 埠,您可以嘗試設定serial_device=COM4。
我不知道為什么,但并不是所有的 serproxy 下載都對我有用。我對as3glue附帶的版本很幸運。(FWIW,您還可以查看我2010 年的Arduino 和 Actionscript談話資源。它不包括 serproxy,但確實有一些 Arduino/Flash 示例和希望有用的幻燈片)。
就我個人而言,盡管我很喜歡 actionscript,但我建議在不再支持 Flash Player 的情況下切換語言。
我能想到的最接近的語法是 javascript,而p5.js是一個創意友好的庫。它的繪圖功能(rect(),image()等)以及 DOM(例如createButton()))應該有助于重新創建您的按鈕(onBtn, offBtn)。
在串口控制方面,可以使用p5.serialport庫。它使用p5.serialcontrol類似于serproxy(但使用 WebSockets 而不是原始 TCP 套接字)。正確配置串行埠后,您就可以開始調整它們的writeExample. 它寫 'L'/'H',你可以'n','f'并使用兩個按鈕而不是mousePressed()。
(如果你感覺更冒險,你可以嘗試 Python 和pyserial。語法與 actionscript 完全不同,但也不那么冗長。對于 UI,如果它只有兩個按鈕,tkinter可能就足夠了,否則有很多其他時髦的 GUI 庫,例如kivy )
更新查看您的視頻并重新閱讀您的問題使本節脫穎而出:
我需要讓它反轉,如果我按下閃光燈中的按鈕(pin13),我需要從 Arduino 控制閃光燈,它將轉到AndStop Frame(2)或(1)。
第一步是更改 Arduino 代碼,使其讀取按鈕而不是點亮 LED:
- 改變
pinMode(13, INPUT) - 使用
digitalRead()而不是digitalWrite() - 一個想法是簡單地寫入一個位元組:a
1或 a0取決于按鈕引腳狀態(由 回傳digitalRead())。
這是一個基本示例:
#define BUTTON 13
void setup(){
Serial.begin(57600);
pinMode(BUTTON, INPUT);
}
void loop(){
Serial.write(digitalRead(BUTTON));
// wait 40ms ~= 25fps
delay(40);
}
筆記:
Serial.write與 不同Serial.println():它既不發送字串也不發送結束行字符 (\n)。請注意,您可能不會在串行監視器中將此字符視為純 ASCII,但它應該以十六進制顯示。(比如CoolTerm就有這個功能)delay()被添加以不經常發送過多的串行訊息(將輸出限制為 ~25fps)- 此草圖正在
continuously輸出按鈕狀態:您可能想要“去抖動”:檢查狀態是否已更改(從關閉到打開或相反)以僅在狀態更改時發送串行訊息
這是一個演示去抖動的基本示例:
#define BUTTON 13
bool wasOn, isOn;
void setup(){
Serial.begin(57600);
pinMode(BUTTON, INPUT);
}
void loop(){
isOn = digitalRead(BUTTON);
if(!wasOn && isOn){
wasOn = true;
Serial.write(1);
}
if(wasOn && !isOn){
wasOn = false;
Serial.write(0);
}
// wait 40ms ~= 25fps
delay(40);
}
上述代碼未經 Arduino 測驗,因此可能需要測驗除錯。(CoolTerm 的十六進制視圖會很有用)。
您可能需要仔細檢查的另一件事是如果按下按鈕或digitalRead()回傳(并調整如果預期狀態在動作腳本中出現翻轉的情況)。或者更改動作腳本中的框架。10Serial.writegotoAndStop()
關于 as3 代碼,您可能需要使用Socket'socketData事件和readBoolean(). 同樣,在沒有安裝 Flash 的情況下,這是未經測驗的,但希望是一個有用的指南,指導您如何實作它(意味著可能需要除錯/調整):
import flash.net.Socket;
import flash.events.Event;
import flash.events.ProgressEvent;
var _socket:Socket = new Socket();
var _proxyAddress:String = "127.0.0.1";
var _proxyPort:uint = 5331;
_socket.addEventListener(Event.CONNECT, onConnect);
// listen to incoming Arduino data
_socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);
_socket.connect(_proxyAddress, _proxyPort);
function onConnect(event:Event):void{
trace("Socket Connected");
}
// called when new Arduino data arrives
function onData(event:ProgressEvent):void{
// read the 1 or 0 from Arduino
var isOn:Boolean = _socket.readBoolean();
// print received data
trace("arduino data event", event, "isOn =",isOn);
// change frames according to received boolean value
if(isOn){
gotoAndStop(1);
}else{
gotoAndStop(2);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529269.html
下一篇:AS3粒子爆炸
