Arduino - Desenho via Web usando o controlador de motor de passo
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
| × | 1 |
Sobre este projeto
Demonstração
Se você é novo no Arduino, pode começar com:
- Tutoriais do Arduino para iniciantes.
- Tudo sobre motor para Arduino
Como funciona
Quando um dedo toca na área de desenho na página da web, a coordenada XY do ponto de toque é enviada ao Arduino. Após escalar a coordenada, o Arduino moverá dois motores de passo para localizar a caneta nessa coordenada. Durante o período de movimentação, o Arduino envia continuamente a trajetória da caneta para o aplicativo da web, o aplicativo da web desenha a trajetória na tela.
Código-fonte
O código-fonte inclui duas partes:código do Arduino e código da interface do usuário da web.
Código Arduino
Este é o código arduino, que é executado em loop infinito para:
- Receber o comando da página da web e executar a tarefa de acordo com o comando.
- CMD_MOVE:mova a caneta para uma posição controlando o motor de duas etapas
- CMD_PEN_UP:levante a caneta mudando o ângulo do servo motor
- CMD_PEN_DOWN:abaixe a caneta alterando o ângulo do servo motor
- Ler continuamente a posição atual da caneta e enviar para a página da web
Interface do usuário da web
Veja o código na seção Código
- Fornecimento da interface do usuário
- Manipular o evento do usuário e enviar o comando com coordenadas para o Arduino
- Receber a trajetória do Arduino e desenhá-la na página da web
remote_draw.php é um arquivo que contém a interface do usuário da web. Ele precisa ser armazenado no escudo PHPoC [WiFi]. Para fazer upload do arquivo para PHPoC [WiFi] Shield, execute as seguintes etapas:
- Copie o código abaixo e salve-o no arquivo remote_draw.php.
- Instale o depurador PHPoC
- Conecte o PHPoC à proteção do PHPoC [WiFi] via cabo micro-USB de acordo com esta instrução. Observe que o Arduino deve estar ligado.
- Faça upload do arquivo remote_draw.php para PHPoC [WiFi] Shield de acordo com esta instrução
Como fazer
- Informações de rede de configuração para escudo PHPoC ou escudo WiFi PHPoC
- Instale a biblioteca PHPoC
- Instale a biblioteca de expansão PHPoC
- Compilar e fazer upload do código para o Arduino
- Carregue a interface do usuário da web para o escudo PHPoC [WiFi]
- Abra o Serial Monitor e copie o endereço IP do PHPoC Shield
- Acesse a interface do usuário da web por meio do navegador da web:http:// ip_address_of_shield /remote_draw.php
- Desenhar via web
Para comprar componentes eletrônicos, você pode encomendá-los em utsource.net
O melhor Arduino Starter Kit para iniciantes
Veja o melhor kit Arduino para iniciantes
Referências de função
- Serial.begin ()
- Serial.println ()
- atraso ()
- milis ()
- para loop
- while loop
- se mais
- loop ()
- configuração ()
- String.toInt ()
- String.substring ()
- String.indexOf ()
- String.remove ()
- String.equals ()
Código
- Código Arduino
- Interface do usuário da web
Código Arduino Arduino
#include#include #include #define MAX_X 55550 // unidade é a etapa # define MAX_Y 68780 // unidade é etapa # define TOUCH_OFFSET 5000 // unidade é passo # definir PEN_STATE_UP 0 # definir PEN_STATE_DOWN 1 # definir CMD_PEN_UP 0 # definir CMD_PEN_DOWN 1 # definir CMD_MOVE 2 # definir STEP_MODE 32 # definir SPEED_X_COEF ((longo) 40 * STEP_MODE) #define_MODE SPEED_Y_COEF (long) 40 STEPED_Y_COEF * ((longo) 1500 * STEP_MODE) #define SPEED_Y_MAX ((longo) 1500 * STEP_MODE) #define ACCEL_X_MAX ((longo) 6000 * STEP_MODE) #define ACCEL_Y_MAX ((longo) 6000 * STEP_MODE) #define ACCEL_X_MAX ((longo) 6000 * STEP_MODE) #define ACCEL_Y_MAX ((longo) 6000 * STEP_MODE # define STEPTA_STATE_ST 1 define RESOLUÇÃO 500 # define MIN_UPDATE_INTERVAL 100 // em milissegundos servidorPhpocServer (80); ExpansionStepper stepX (14); ExpansionStepper stepY (13); Servo servo; long preX =0; long preY =0; byte penState =PEN_STATE_UPed; bool isUnlockedY =false; int forwardDirX =-1; / * direção do plotter XY quando o motor X avança, dependendo da instalação, deve ser testado para determinar os valores * / int forwardDirY =+1; / * direção do plotter XY quando o motor Y se move para cima, dependendo da instalação, deve ser testado para determinar os valores * / 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); // move a caneta para (0, 0) stepX.stepGotoSW (0, -forwardDirX); stepY.stepGotoSW (0, -forwardDirY); xyWait (); stepX.setPosition (0); stepY.setPosition (0); // descomente este bloco para a primeira execução e altere o valor na linha 6, 7 deste arquivo e linha 33 de index.php de acordo com o valor no console IDE / * // verifique os passos máximos stepX.stepGotoSW (1, forwardDirX); stepY.stepGotoSW (1, forwardDirY); xyWait (); // altere esses valores na linha 45 de 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; if (y (MAX_Y - TOUCH_OFFSET)) y =MAX_Y - TOUCH_OFFSET; x * =forwardDirX; y * =forwardDirY; int32_t deltaX =x - stepX.getPosition (); int32_t deltaY =y - stepY.getPosition (); deltaX =abs (deltaX); deltaY =abs (deltaY); velocidade longaX =SPEED_X_COEF * abs (deltaX); velocidade longaY =SPEED_Y_COEF * abs (deltaY); if (speedX> speedY) {if (speedX> SPEED_X_MAX) speedX =SPEED_X_MAX; proporção dupla =deltaY / (duplo) deltaX; speedY =(longo) (proporção * speedX); } else {if (speedY> SPEED_Y_MAX) speedY =SPEED_Y_MAX; proporção dupla =deltaX / (duplo) deltaY; speedX =(longo) (proporção * speedY); } long accelX; long accelY; if (speedX MIN_UPDATE_INTERVAL) isUpdate =true; longo curX =stepX.getPosition (); long curY =stepY.getPosition (); longo deltaX =curX - preX; deltaY longo =curY - presa; long dist =sqrt (pow (deltaX, 2) + pow (deltaY, 2)); if (dist> RESOLUTION) isUpdate =true; if (isUpdate ==false || dist ==0) return false; lastUpdateMillis =curMillis; preX =curX; preY =curY; sendPositionToWeb (); // envia a posição atual para exibir na web} void sendPositionToWeb () {char wbuf [20]; long x =stepX.getPosition () * forwardDirX; long y =stepY.getPosition () * forwardDirY; Dados de string =String (F ("[")) + x + String (F (",")) + y + String (F (",")) + penState + String (F ("] \ n")); data.toCharArray (wbuf, data.length () + 1); server.write (wbuf, data.length ());} void setup () {Serial.begin (9600); while (! Serial); Phpoc.begin (PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket ("xy_plotter"); Serial.print ("endereço do servidor WebSocket:"); Serial.println (Phpoc.localIP ()); Expansion.begin (460800); servo.attach (8); / ** NOTA:Para a primeira execução:* - descomente o último bloco em xyInit () * - execute o código Arduino * - altere o valor na linha 6, 7 deste arquivo e na linha 33 de index.php de acordo com o valor no IDE console. ** / xyInit (); lastUpdateMillis =millis ();} void loop () {// aguarde um novo cliente:PhpocClient client =server.available (); if (cliente) {String data =client.readLine (); if (dados) {//Serial.println(data); byte separatorPos1 =data.indexOf (':'); byte separatorPos2 =data.lastIndexOf (':'); byte cmd =data.substring (0, separatorPos1) .toInt (); long x =data.substring (separatorPos1 + 1, separatorPos2) .toInt (); long y =data.substring (separatorPos2 + 1) .toInt (); switch (cmd) {case CMD_PEN_DOWN:xyGoto (x, y); // xyWait (); while (stepX.getState ()> 1 || stepY.getState ()> 1) xyCheckUpdateToWeb (); penDown (); pausa; case CMD_PEN_UP:// xyWait (); while (stepX.getState ()> 1 || stepY.getState ()> 1) xyCheckUpdateToWeb (); penUp (); pausa; case CMD_MOVE:xyGoto (x, y); pausa; }}} xyCheckUpdateToWeb ();}
Interface do usuário da web PHP
Arduino - PHPoC Shield - XY Plotter
WebSocket: null
Processo de manufatura
- Decodificador DTMF usando apenas Arduino
- Controlador DMX operado pela web
- Sistema de detecção de humanos usando Arduino Uno
- Controlador de jogo Arduino
- Sistema de alarme Arduino:SERENA
- Brinquedo controlado pelo Android usando Raspberry Motor Shield
- Robô seguidor de linha
- Controle o Arduino Rover usando Firmata e o controlador do Xbox One
- Arduino - Enviar temperatura para a Web via serial
- Arduino - Desbloqueio de Padrão da Web