Я могу управлять Arduino из Flash, он отлично работает для меня, но мне нужно сделать его обратным, Мне нужно управлять вспышкой с Arduino, если я нажму кнопку (контакт 13) во вспышке, она перейдет в режим AndStop 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");
}
Flash Code для Arduino вкл и выкл
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);
}
Код Ардуино
#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);
}
}
}
@MohtadeenMastoor Если я правильно понимаю, вы хотите «обратить» логику кода, поэтому вместо управления светодиодом на Arduino из Actionscript вы считываете состояние кнопки на том же выводе Arduino и управляете кадром через Actionscript. Если это так, я предоставил обновление, которое, надеюсь, предоставит полезную информацию.





Прошло более десяти лет с тех пор, как я использовал actionscript, и у меня больше нет лицензии на Flash, поэтому, к сожалению, я не смогу воспроизвести вашу установку.
При этом у меня может быть несколько, надеюсь, полезных указателей:
Дважды проверьте правильность настройки serproxy.cfg.
Ваш файл serproxy.cfg настроен для подключения к Arduino через Windows через порт COM4 со скоростью передачи 57600. Двойная проверка:
Когда я в последний раз использовал serproxy, я использовал OSX, и мне пришлось настроить serial_device вместо comm_ports. Не уверен на 100%, что это сработает, но если COM4 действительно является вашим портом Arduino, вы можете попробовать настройки serial_device=COM4.
Не знаю почему, но не все загрузки serproxy работали у меня. Мне повезло с версией, которая поставлялась с as3glue. (FWIW, вы также можете ознакомиться с моими ресурсами для обсуждения Arduino и Actionscript за 2010 год. Он не включает 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, но также намного менее многословен. Для пользовательского интерфейса, если это всего две кнопки, tkinter может быть достаточно. , в противном случае есть много других шикарных библиотек с графическим интерфейсом, таких как kivy)
Обновить Просмотр вашего видео и повторное чтение вашего вопроса сделали этот раздел выделяющимся:
Мне нужно сделать реверс, мне нужно управлять вспышкой с Ардуино если я нажму кнопку (контакт 13) во флэш-памяти, она перейдет к AndStop Рамка (2) или (1).
Первый шаг — изменить код Arduino, чтобы он читал кнопку, а не зажигал светодиод:
pinMode(13, INPUT)digitalWrite()1 или 0 в зависимости от состояния вывода кнопки (возвращается 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). Имейте в виду, что вы можете не увидеть этот символ в Serial Monitor как простой ASCII, но он должен быть виден как шестнадцатеричный. (например, у CoolTerm есть такая функция)delay() добавлено, чтобы не слишком часто заливать серийные сообщения слишком большим количеством сообщений (ограничение вывода до ~ 25 кадров в секунду)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() возвращает 1, если кнопка нажата, или 0 (и отрегулируйте, что Serial.write, если ожидаемое состояние отображается перевернутым в сценарии действий).
В качестве альтернативы измените кадр gotoAndStop() в actionscript.
Что касается кода as3, вам может понадобиться использовать событие 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);
}
}
Большое спасибо за ваши усилия, я получаю сообщение об ошибке ниже. Сцена 1, Слой «Подключение Arduino», Кадр 1, Строка 2, Столбец 17 1172: Определение flash.net: Событие не найдено. Сцена 1, слой «Подключение Arduino», кадр 1, строка 3, столбец 17 1172: определение flash.net:ProgressEvent не найдено. Сцена 1, слой «Подключение Arduino», кадр 1, строка 2, столбец 17 1172: Определение flash.net: Событие не найдено. Сцена 1, слой «Подключение Arduino», кадр 1, строка 3, столбец 17 1172: определение flash.net:ProgressEvent не найдено.
ага! Я получаю сообщение об ошибке ниже, но видеоклип работает, и теперь кнопка также работает. Сцена 1, слой «Подключение Arduino», кадр 1, строка 17, столбец 10. Предупреждение: 1090: проблема миграции: обработчик события onData не запущен. автоматически Flash Player во время выполнения в ActionScript 3.0. Вы должны сначала зарегистрировать этот обработчик для события, используя addEventListener ('data', callback_handler).
скриншот paste.pics/JMY4C
Неплохо! Это предупреждение, а не ошибка: оно не останавливает выполнение кода. Я вижу одно событие данных Arduino, отслеживаемое в окнах вывода: это положительно! Постоянно срабатывает? (например, всякий раз, когда состояние кнопки менялось?) (Я сделал небольшую настройку, чтобы отслеживать значение isOn в приведенном выше коде: вы можете попробовать). Надеюсь, несмотря на предупреждение, код все равно будет запускаться и отправлять событие данных сокета каждый раз при изменении состояния кнопки🤞
screenShot paste.pics/JN9DV Кнопка работает как при нажатии загорается при выходе из клипа кнопка загорается
Красивый! Окно вывода предполагает, что это работает. В настоящее время я вижу только один кадр, поэтому не могу сказать, соответствует ли кадр состоянию кнопки, как вы намеревались, но если он просто не меняет местами if (isOn) на if (!isOn), чтобы поменять местами gotoAndStop кадры. Судя по окну вывода, то, чего вы пытаетесь достичь, в значительной степени там: прошивка Arduino отправляет состояние кнопки (отклонено, не переполняется постоянным сообщением о том же состоянии), и вы можете получить логическое состояние в actionscript. Вы можете управлять временной шкалой или всем, что вам нужно во Flash, с помощью кнопки Arduino! Радоваться, веселиться!
Последний комментарий: я заметил, что ваш проект Flash ориентирован на Adobe AIR. Сам не пробовал, но as3-arduino-connector AIR Native Extension выглядит интересно. Это должно позволить вам подключиться к Arduino без использования serproxy, но потребует более глубоких знаний actionscript 3.0/Adobe AIR. Совершенно другой подход — переключить Arduino на микроконтроллер WiFi, такой как ESP32, и настроить его либо как сервер Websocket (используя клиентскую библиотеку as3.0 WebSocket), либо как сервер HTTP REST с использованием встроенного flash.net.URLLoader.
... или даже OSC (с использованием библиотеки Adobe AIR OSC (на основе сокетов UDP (Datagram))). ХТН
Вы правы, но я не очень хорошо разбираюсь в As3 + Arduino :( теперь мне нужно сохранить две кнопки, такие же, как флэш-ролик, для отдельной кнопки и для отдельной кнопки
Это нормально, я помню, что некоторое время назад мне потребовалось несколько хороших часов, чтобы изучить учебник по мерцанию Arduino. В наши дни, по крайней мере, доступно гораздо больше ресурсов. Не беспокойтесь слишком о том, что вы нехороши: нужно с чего-то начинать! Просто нужно продолжать идти в своем собственном темпе. Комментарии становятся длинными, что не рекомендуется на этом сайте. Если ответ был полезен, считайте голосованием/отметкой галочкой, если это решило вашу проблему. Я рекомендую опубликовать еще один вопрос, связанный с этим, сосредоточив внимание на двух кнопках.
...для начала вам может понадобиться освоиться с двоичным кодом. Вы уже отправили один бит (вкл/выкл), но теперь вам нужно отправить байт, из которых вы будете использовать только первые два бита: по одному для каждой кнопки. (например, обе кнопки выключены = 0, 1-я кнопка включена, вторая кнопка выключена = 1, 1-я кнопка выключена, вторая кнопка включена = 2, обе кнопки включены = 3). Вы можете легко визуализировать это в калькуляторе Windows, установленном в режим просмотра программиста, и используя клавиатуру для переключения битов: переключите последние 2 нуля (представляющие состояния кнопок) и обратите внимание на двоичные (BIN) и десятичные (DEC) значения в левом верхнем углу. Затем вы обновляете код Arduino.
... вы уже использовали pinMode() для настройки одной кнопки как INPUT: сделайте то же самое для второй кнопки, воспроизведите логику digitalRead(), а также отмените дребезг (вам понадобятся две логические переменные на кнопку (например, bool was1On, is1On, was2On, is2On;). Подвох вы будете использовать байт для хранения состояния обеих кнопок, и вы можете использовать bitSet() для установки бита каждой кнопки. Как только это будет сделано, вы можете записать его в последовательный порт (и проверить его тоже!). В as3 .0 вам нужно поменять местами readBoolean() на readByte(), и вы также...
... необходимо учитывать диапазон readByte() (например, от -127 до 127, а не 0-255), поэтому может потребоваться `что-то вроде var buttonStates:int = _socket.readBoolean() & 255; для маскировки (маскировка бита поиска) и возврата к 0-255 диапазон. После этого вы можете прочитать каждый бит, поэтому используйте оператор switch для обработки 4 состояний (по 2 на кнопку).
Привет, Джордж! Ты должен увидеть это видео о результате своих усилий drive.google.com/file/d/16EXjT_WW_YZY50-TOPSiEs6ccg-9ssn8/…
Это замечательно ! Спасибо, что поделился ! Вы вникаете: молодец, Мохтадин!
Привет, еще один вопрос, в настоящее время я отправляю числа из Arduino во флэш-память, например Serial.write(1);. как я могу отправить символ как (abc или да нет)?
Чтение документов as3 Socket похоже, что readUTF() может сделать то, что вам нужно, с оговоркой: «Предполагается, что строка имеет префикс с коротким целым числом без знака, которое указывает длину в байтах». (что означает необходимость сделать что-то вроде Serial.write(2);Serial.write("no"); (поскольку «нет» состоит из двух символов) или Serial.write(3);Serial.write("yes"); (поскольку «да» состоит из трех символов) для префикса строки, которую вы пишете, с количеством символов, которые должны быть прочитаны в as3. Надеюсь. это помогает.
Я только что заметил, что есть readUnsignedByte, который читает один байт, но уже в диапазоне 0-255. Это может быть сложнее осуществить в as3, но не невозможно: вы должны использовать Serial.println("yes"); / Serial.println("no");, которые также добавляют перевод строки (\n) в конце. Затем в as3 у вас будет логическое значение, чтобы проверить, является ли текущий полученный символ (через readUnsignedByte\n (десятичное значение 10, см. Таблицу ASCII)) или нет. Если текущий символ не \n (например, байт в символ через help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…), добавьте
@MohtadeenMastoor Я нашел этот пример Arduino. Он иллюстрирует упомянутую выше идею буферизации по одному символу в строку до \n: вам нужно написать эквивалент as3 (используя readUnsignedByte() / String.fromCharCode). Я бы попробовал базовый скетч Arduino сначала отправить Serial.write(3);Serial.write("yes"); и сначала использовать trace(_socket.readUTF()); в onData. Удачи!
Так в чем проблема? У вас нет кода, который должен ждать, а затем читать дату из сокета. Вы можете начать с официального примера: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…