Не удается отправить команду с Arduino на Flash AS3

Я могу управлять 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);
}

  }
}

Так в чем проблема? У вас нет кода, который должен ждать, а затем читать дату из сокета. Вы можете начать с официального примера: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/‌​…

Organis 05.11.2022 15:28

@MohtadeenMastoor Если я правильно понимаю, вы хотите «обратить» логику кода, поэтому вместо управления светодиодом на Arduino из Actionscript вы считываете состояние кнопки на том же выводе Arduino и управляете кадром через Actionscript. Если это так, я предоставил обновление, которое, надеюсь, предоставит полезную информацию.

George Profenza 05.11.2022 22:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прошло более десяти лет с тех пор, как я использовал actionscript, и у меня больше нет лицензии на Flash, поэтому, к сожалению, я не смогу воспроизвести вашу установку.

При этом у меня может быть несколько, надеюсь, полезных указателей:

Дважды проверьте правильность настройки serproxy.cfg. Ваш файл serproxy.cfg настроен для подключения к Arduino через Windows через порт COM4 со скоростью передачи 57600. Двойная проверка:

  • порт и скорость передачи совпадают
  • устройство подключено через USB
  • порт не занят/уже открыт в серийном мониторе Arduino (или других инструментах для чтения/записи в тот же COM-порт)

Когда я в последний раз использовал 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)
  • используйте digitalRead() вместо 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 не найдено.

Mohtadeen Mastoor 06.11.2022 01:23

ага! Я получаю сообщение об ошибке ниже, но видеоклип работает, и теперь кнопка также работает. Сцена 1, слой «Подключение Arduino», кадр 1, строка 17, столбец 10. Предупреждение: 1090: проблема миграции: обработчик события onData не запущен. автоматически Flash Player во время выполнения в ActionScript 3.0. Вы должны сначала зарегистрировать этот обработчик для события, используя addEventListener ('data', callback_handler).

Mohtadeen Mastoor 06.11.2022 09:13

скриншот paste.pics/JMY4C

Mohtadeen Mastoor 06.11.2022 09:17

Неплохо! Это предупреждение, а не ошибка: оно не останавливает выполнение кода. Я вижу одно событие данных Arduino, отслеживаемое в окнах вывода: это положительно! Постоянно срабатывает? (например, всякий раз, когда состояние кнопки менялось?) (Я сделал небольшую настройку, чтобы отслеживать значение isOn в приведенном выше коде: вы можете попробовать). Надеюсь, несмотря на предупреждение, код все равно будет запускаться и отправлять событие данных сокета каждый раз при изменении состояния кнопки🤞

George Profenza 06.11.2022 15:39

screenShot paste.pics/JN9DV Кнопка работает как при нажатии загорается при выходе из клипа кнопка загорается

Mohtadeen Mastoor 06.11.2022 18:18

Красивый! Окно вывода предполагает, что это работает. В настоящее время я вижу только один кадр, поэтому не могу сказать, соответствует ли кадр состоянию кнопки, как вы намеревались, но если он просто не меняет местами if (isOn) на if (!isOn), чтобы поменять местами gotoAndStop кадры. Судя по окну вывода, то, чего вы пытаетесь достичь, в значительной степени там: прошивка Arduino отправляет состояние кнопки (отклонено, не переполняется постоянным сообщением о том же состоянии), и вы можете получить логическое состояние в actionscript. Вы можете управлять временной шкалой или всем, что вам нужно во Flash, с помощью кнопки Arduino! Радоваться, веселиться!

George Profenza 06.11.2022 22:52

Последний комментарий: я заметил, что ваш проект 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.

George Profenza 06.11.2022 23:03

... или даже OSC (с использованием библиотеки Adobe AIR OSC (на основе сокетов UDP (Datagram))). ХТН

George Profenza 06.11.2022 23:03

Вы правы, но я не очень хорошо разбираюсь в As3 + Arduino :( теперь мне нужно сохранить две кнопки, такие же, как флэш-ролик, для отдельной кнопки и для отдельной кнопки

Mohtadeen Mastoor 06.11.2022 23:30

Это нормально, я помню, что некоторое время назад мне потребовалось несколько хороших часов, чтобы изучить учебник по мерцанию Arduino. В наши дни, по крайней мере, доступно гораздо больше ресурсов. Не беспокойтесь слишком о том, что вы нехороши: нужно с чего-то начинать! Просто нужно продолжать идти в своем собственном темпе. Комментарии становятся длинными, что не рекомендуется на этом сайте. Если ответ был полезен, считайте голосованием/отметкой галочкой, если это решило вашу проблему. Я рекомендую опубликовать еще один вопрос, связанный с этим, сосредоточив внимание на двух кнопках.

George Profenza 07.11.2022 00:28

...для начала вам может понадобиться освоиться с двоичным кодом. Вы уже отправили один бит (вкл/выкл), но теперь вам нужно отправить байт, из которых вы будете использовать только первые два бита: по одному для каждой кнопки. (например, обе кнопки выключены = 0, 1-я кнопка включена, вторая кнопка выключена = 1, 1-я кнопка выключена, вторая кнопка включена = 2, обе кнопки включены = 3). Вы можете легко визуализировать это в калькуляторе Windows, установленном в режим просмотра программиста, и используя клавиатуру для переключения битов: переключите последние 2 нуля (представляющие состояния кнопок) и обратите внимание на двоичные (BIN) и десятичные (DEC) значения в левом верхнем углу. Затем вы обновляете код Arduino.

George Profenza 07.11.2022 00:38

... вы уже использовали pinMode() для настройки одной кнопки как INPUT: сделайте то же самое для второй кнопки, воспроизведите логику digitalRead(), а также отмените дребезг (вам понадобятся две логические переменные на кнопку (например, bool was1On, is1On, was2On, is2On;). Подвох вы будете использовать байт для хранения состояния обеих кнопок, и вы можете использовать bitSet() для установки бита каждой кнопки. Как только это будет сделано, вы можете записать его в последовательный порт (и проверить его тоже!). В as3 .0 вам нужно поменять местами readBoolean() на readByte(), и вы также...

George Profenza 07.11.2022 00:43

... необходимо учитывать диапазон readByte() (например, от -127 до 127, а не 0-255), поэтому может потребоваться `что-то вроде var buttonStates:int = _socket.readBoolean() & 255; для маскировки (маскировка бита поиска) и возврата к 0-255 диапазон. После этого вы можете прочитать каждый бит, поэтому используйте оператор switch для обработки 4 состояний (по 2 на кнопку).

George Profenza 07.11.2022 00:46

Привет, Джордж! Ты должен увидеть это видео о результате своих усилий drive.google.com/file/d/16EXjT_WW_YZY50-TOPSiEs6ccg-9ssn8/…

Mohtadeen Mastoor 08.11.2022 12:59

Это замечательно ! Спасибо, что поделился ! Вы вникаете: молодец, Мохтадин!

George Profenza 08.11.2022 14:29

Привет, еще один вопрос, в настоящее время я отправляю числа из Arduino во флэш-память, например Serial.write(1);. как я могу отправить символ как (abc или да нет)?

Mohtadeen Mastoor 11.11.2022 10:56

Чтение документов as3 Socket похоже, что readUTF() может сделать то, что вам нужно, с оговоркой: «Предполагается, что строка имеет префикс с коротким целым числом без знака, которое указывает длину в байтах». (что означает необходимость сделать что-то вроде Serial.write(2);Serial.write("no"); (поскольку «нет» состоит из двух символов) или Serial.write(3);Serial.write("yes"); (поскольку «да» состоит из трех символов) для префикса строки, которую вы пишете, с количеством символов, которые должны быть прочитаны в as3. Надеюсь. это помогает.

George Profenza 11.11.2022 11:39

Я только что заметил, что есть 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/‌​…), добавьте

George Profenza 11.11.2022 11:44

@MohtadeenMastoor Я нашел этот пример Arduino. Он иллюстрирует упомянутую выше идею буферизации по одному символу в строку до \n: вам нужно написать эквивалент as3 (используя readUnsignedByte() / String.fromCharCode). Я бы попробовал базовый скетч Arduino сначала отправить Serial.write(3);Serial.write("yes"); и сначала использовать trace(_socket.readUTF()); в onData. Удачи!

George Profenza 11.11.2022 13:05

Другие вопросы по теме