Arduino - Рисование через Интернет с помощью контроллера шагового двигателя
Компоненты и расходные материалы
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
| × | 1 |
Об этом проекте
Демонстрация
Если вы новичок в Arduino, вы можете начать с:
- Руководства по Arduino для новичков.
- Все о моторе для Arduino
Как это работает
Когда палец касается области рисования на веб-странице, координата XY точки касания отправляется в Arduino. После масштабирования координаты Arduino переместит два шаговых двигателя, чтобы переместить перо в эту координату. В течение периода перемещения Arduino непрерывно отправляет траекторию пера в веб-приложение, веб-приложение рисует траекторию на холсте.
Исходный код
Исходный код состоит из двух частей:кода Arduino и кода веб-интерфейса пользователя.
Код Arduino
Это код Arduino, который запускается в бесконечном цикле, чтобы:
- Получение команды с веб-страницы и выполнение задачи в соответствии с командой.
- CMD_MOVE:переместите перо в положение, управляя двумя шаговыми двигателями.
- CMD_PEN_UP:поднимите перо, изменив угол серводвигателя.
- CMD_PEN_DOWN:опустите перо, изменив угол серводвигателя.
- Непрерывно считывать текущее положение пера и отправлять на веб-страницу.
Пользовательский веб-интерфейс
См. Код в разделе «Код»
- Обеспечение пользовательского интерфейса
- Обработка пользовательского события и отправка команды с координатами в Arduino.
- Получение траектории от Arduino и рисование ее на веб-странице.
remote_draw.php - это файл, содержащий пользовательский веб-интерфейс. Его необходимо хранить на PHPoC [WiFi] Shield. Чтобы загрузить файл в PHPoC [WiFi] Shield, выполните следующие действия:
- Скопируйте приведенный ниже код и сохраните его в файле remote_draw.php.
- Установить отладчик PHPoC
- Подключите PHPoC к PHPoC [WiFi] Shield через кабель micro-USB в соответствии с этой инструкцией. Обратите внимание, что Arduino должен быть включен.
- Загрузите файл remote_draw.php в PHPoC [WiFi] Shield в соответствии с этой инструкцией.
Как сделать
- Сконфигурируйте сетевую информацию для PHPoC Shield или PHPoC WiFi shield.
- Установить библиотеку PHPoC
- Установить библиотеку расширения PHPoC
- Скомпилируйте и загрузите код в Arduino
- Загрузить пользовательский веб-интерфейс в PHPoC [WiFi] Shield
- Откройте Serial Monitor и скопируйте IP-адрес PHPoC Shield.
- Доступ к веб-интерфейсу пользователя через веб-браузер:http:// ip_address_of_shield /remote_draw.php
- Рисование через Интернет
Чтобы купить электронные компоненты, вы можете заказать их на utsource.net
Лучший стартовый комплект Arduino для начинающих
См. «Лучший комплект Arduino для начинающих»
Ссылки на функции
- Serial.begin ()
- Serial.println ()
- delay ()
- миллис ()
- цикл для
- цикл while
- если еще
- цикл ()
- setup ()
- String.toInt ()
- String.substring ()
- String.indexOf ()
- String.remove ()
- String.equals ()
Код
- Код Arduino
- Пользовательский веб-интерфейс
Код Arduino Arduino
#include#include #include #define MAX_X 55550 // unit is step # define MAX_Y 68780 // unit is step # define TOUCH_OFFSET 5000 // unit is шаг # определить PEN_STATE_UP 0 # определить PEN_STATE_DOWN 1 # определить CMD_PEN_UP 0 # определить CMD_PEN_DOWN 1 # определить CMD_MOVE 2 # определить STEP_MODE 32 # определить SPEED_X_COEF ((длинный) 40 * STEP_MODE) #define SPEED_ME_ODE ((длинный) 1500 * STEP_MODE) #define SPEED_Y_MAX ((long) 1500 * STEP_MODE) #define ACCEL_X_MAX ((long) 6000 * STEP_MODE) #define ACCEL_Y_MAX ((long) 6000 * STEP_MODE #define STEP_STEP_STEP 0_STATE) #define STEP_STEP 0_STATE) #define STEP_STEP 0_STATE define RESOLUTION 500 # define MIN_UPDATE_INTERVAL 100 // в миллисекундахPhpocServer server (80); ExpansionStepper stepX (14); ExpansionStepper stepY (13); Servo servo; long preX =0; long preY =0; byte penState =PEN_STATE_locked; boXol isUnUnUn; bool isUnlockedY =false; int forwardDirX =-1; / * направление XY плоттера при движении двигателя X вперед, в зависимости от установки. Это должно быть протестировано для определения значений * / int forwardDirY =+1; / * направление XY плоттера при движении двигателя Y вверх, в зависимости от установки. Это должно быть проверено для определения значений * / unsigned long lastUpdateMillis; void penUp () {servo.write (110); penState =PEN_STATE_UP;} void penDown () {servo.write (180); penState =PEN_STATE_DOWN;} void xyWait () {while (stepX.getState ()> 1 || stepY.getState ()> 1);} void xyInit () {penUp (); stepX.setMode (STEP_MODE); stepX.setVrefStop (4); stepX.setVrefDrive (15); stepX.setResonance (120, 250); stepX.setSpeed (20000); stepX.setAccel (50000); stepY.setMode (STEP_MODE); stepY.setVrefStop (4); stepY.setVrefDrive (15); stepY.setResonance (120, 250); stepY.setSpeed (20000); stepY.setAccel (50000); // перемещаем перо на (0, 0) stepX.stepGotoSW (0, -forwardDirX); stepY.stepGotoSW (0, -forwardDirY); xyWait (); stepX.setPosition (0); stepY.setPosition (0); // раскомментируйте этот блок для первого запуска и измените значение в строке 6, 7 этого файла и строке 33 index.php в соответствии со значением в консоли IDE / * // проверьте максимальное количество шагов stepX.stepGotoSW (1, forwardDirX); stepY.stepGotoSW (1, forwardDirY); xyWait (); // изменить это значение в строке 45 index.php Serial.print (F ("MAX_X:")); Serial.println (stepX.getPosition () * forwardDirX); Serial.print (F ("MAX_Y:")); Serial.println (stepY.getPosition () * forwardDirY); * / xyGoto (TOUCH_OFFSET, TOUCH_OFFSET); xyWait (); stepX.setEioMode (0, EIO_MODE_LOCK); stepX.setEioMode (1, EIO_MODE_LOCK); stepY.setEioMode (0, EIO_MODE_LOCK); stepY.setEioMode (1, EIO_MODE_LOCK);} void xyGoto (long x, long y) {if (x (MAX_X - TOUCH_OFFSET)) x =MAX_X - TOUCH_OFFSET; если (y (MAX_Y - TOUCH_OFFSET)) y =MAX_Y - TOUCH_OFFSET; х * =forwardDirX; y * =forwardDirY; int32_t deltaX =x - stepX.getPosition (); int32_t deltaY =y - stepY.getPosition (); deltaX =abs (deltaX); deltaY =abs (deltaY); длинная скоростьX =SPEED_X_COEF * abs (deltaX); long speedY =SPEED_Y_COEF * abs (deltaY); if (speedX> speedY) {if (speedX> SPEED_X_MAX) speedX =SPEED_X_MAX; двойное соотношение =deltaY / (двойное) deltaX; speedY =(long) (ratio * speedX); } else {if (speedY> SPEED_Y_MAX) speedY =SPEED_Y_MAX; двойное соотношение =deltaX / (двойное) deltaY; speedX =(long) (ratio * speedY); } long AccelX; долгое ускорение; если (скоростьX <скоростьY) {ускорение =ACCEL_Y_MAX; двойное передаточное число =ускорение / (удвоение) скорости; AccelX =(длинный) (коэффициент * скоростьX); } еще {AccelX =ACCEL_X_MAX; двойное передаточное число =ускорение X / (двойное) скорость X; ускорение =(длинный) (коэффициент * скоростьY); } if (deltaX! =0) stepX.command (F ("goto% ld% lu% lu"), x, speedX, AccelX); if (deltaY! =0) stepY.command (F ("goto% ld% lu% lu"), y, speedY, ускорение);} void xyCheckUpdateToWeb () {bool isUpdate =false; беззнаковое длинное curMillis =millis (); если ((curMillis - lastUpdateMillis)> MIN_UPDATE_INTERVAL) isUpdate =true; long curX =stepX.getPosition (); long curY =stepY.getPosition (); long deltaX =curX - preX; long deltaY =curY - preY; long dist =sqrt (pow (deltaX, 2) + pow (deltaY, 2)); если (расст> РАЗРЕШЕНИЕ) isUpdate =true; if (isUpdate ==false || dist ==0) return false; lastUpdateMillis =curMillis; preX =curX; preY =curY; sendPositionToWeb (); // отправляем текущую позицию для отображения в сети} void sendPositionToWeb () {char wbuf [20]; long x =stepX.getPosition () * forwardDirX; long y =stepY.getPosition () * forwardDirY; Строковые данные =String (F ("[")) + x + String (F (",")) + y + String (F (",")) + penState + String (F ("] \ n")); data.toCharArray (wbuf, data.length () + 1); server.write (wbuf, data.length ());} установка void () {Serial.begin (9600); в то время как (! серийный); Phpoc.begin (PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket ("xy_plotter"); Serial.print ("Адрес сервера WebSocket:"); Serial.println (Phpoc.localIP ()); Expansion.begin (460800); сервопривод (8); / ** ПРИМЕЧАНИЕ:для первого запуска:* - раскомментируйте последний блок в xyInit () * - запустите код Arduino * - измените значение в строке 6, 7 этого файла и строке 33 index.php в соответствии со значением в IDE консоль. ** / xyInit (); lastUpdateMillis =millis ();} void loop () {// ждем нового клиента:PhpocClient client =server.available (); если (клиент) {Строковые данные =client.readLine (); if (данные) {//Serial.println(data); разделитель байтовPos1 =data.indexOf (':'); разделитель байтовPos2 =data.lastIndexOf (':'); байт cmd =data.substring (0, separatorPos1) .toInt (); длинный x =data.substring (separatorPos1 + 1, separatorPos2) .toInt (); длинный y =data.substring (separatorPos2 + 1) .toInt (); переключатель (cmd) {case CMD_PEN_DOWN:xyGoto (x, y); // xyWait (); while (stepX.getState ()> 1 || stepY.getState ()> 1) xyCheckUpdateToWeb (); penDown (); ломать; case CMD_PEN_UP:// xyWait (); while (stepX.getState ()> 1 || stepY.getState ()> 1) xyCheckUpdateToWeb (); penUp (); ломать; case CMD_MOVE:xyGoto (x, y); ломать; }}} xyCheckUpdateToWeb ();}
Пользовательский веб-интерфейс PHP
Arduino - PHPoC Shield - XY Plotter <стиль> тело {выравнивание текста:центр; цвет фона:# 33C7F2; } #canvas {margin-right:auto; маржа слева:авто; положение:относительное; цвет фона:#FFFFFF; } холст {положение:абсолютное; слева:0px; верх:0px; переполнение-у:авто; переполнение-x:скрыто; -webkit-overflow-scrolling:сенсорный; / * отличная встроенная прокрутка webkit * /} # layer1 {z-index:2; } # layer2 {z-index:1; } # layer3 {z-index:0; }
WebSocket: null
Производственный процесс
- Декодер DTMF с использованием только Arduino
- Веб-контроллер DMX
- Робототехническая система для обнаружения человека с использованием Arduino Uno
- Игровой контроллер Arduino
- Система сигнализации Arduino:SERENA
- Игрушка под управлением Android с использованием Raspberry Motor Shield
- Робот-последователь линии
- Управление Arduino Rover с помощью Firmata и контроллера Xbox One
- Arduino - отправка температуры в Интернет через последовательный
- Arduino - разблокировка веб-шаблона