Olá pessoal! Existe um equívoco na Internet de que, para controlar um computador usando eletrônicos caseiros, são necessárias apenas placas especiais que podem ser reconhecidas como dispositivos USB HID. E com relação ao Arduino, todo mundo apenas fala sobre o
Arduino Leanardo . Bibliotecas populares como
Teclado e
Mouse , que permitem criar emulação do mouse ou teclado usando o microcontrolador, destinam-se apenas a um par de placas Leonardo do Arduino, entre elas.
Falarei sobre como conectar qualquer microcontrolador Arduino (por exemplo, o
Arduino Uno ) e seu programa de processamento. Tendo adicionado a todo o resto o conhecimento de Java, no qual o Processing se baseia, será possível adicionar um projeto sob o controle de todo o computador, e não apenas de seu próprio aplicativo. O tópico de controlar um programa de computador em Java não é algo secreto, o Google e você encontrará tudo, garanto.
Download Ambiente de desenvolvimento (IDE)
Existem muitos ambientes de desenvolvimento integrado para programar microcontroladores em C. puro Destes, o mais conveniente pode ser observado: Atolico, Eclipse, Keil.
No entanto, para a simplicidade e acessibilidade deste guia, usarei o editor IDE do Arduino e escreverei no Arduino C. Você pode baixar esse editor
no site oficial do Arduino .
O ambiente de desenvolvimento para programação no Procrssing também pode ser baixado do
site oficial .
Vale a pena notar, por uma questão de decência, que os dados do IDE são muito semelhantes, porque são gravados no mesmo mecanismo. E quando o Arduino foi criado, os fundadores tentaram simplificar o editor de código o máximo possível, como foi feito no editor de processamento.
Arduino Montamos o circuito e escrevemos o código
Neste exemplo, usarei o Arduino Uno. Um botão, um potenciômetro e um LED serão conectados a ele. Conseqüentemente, eu posso emitir um 0 lógico ou 1. Ler um 0 lógico ou 1. E executar uma
conversão Analógico-Digital (ADC ou ADC), obtendo números de 0 a 1023 (no Arduino Uno um ADC de 10 bits), dependendo da posição do potenciômetro. Você não precisa de muito mais como exemplo, pois essas são as principais funções que um microcontrolador pode executar.
Diagrama de fiação:

No diagrama, o LED do ânodo é conectado a 5V através de um resistor limitador (pelo menos 220 Ohms, preferencialmente 500 Ohms), pelo cátodo para o pino D11. O botão fecha o solo e o pino D2. O potenciômetro altera o potencial no pino A1.
A tarefa do microcontrolador é a seguinte: Se a mensagem “LED - H” chegar na interface serial (porta serial) - acenda o LED. Se a mensagem "LED - L" chegar, apague o LED. A cada 250 ms envia uma mensagem para a porta serial (neste caso, para a tela do computador) a mensagem “Pot -” e o número recebido pela leitura analógica do pino A1. Quando um botão é pressionado, envie uma mensagem “Botão pressionado!” Uma vez.
Aqui está minha sugestão para resolver esse problema (não é um exemplo a seguir):
Firmware para Arduino Uno #define pinPot A1 #define pinLed 11 #define pinBtn 2 void setup() { pinMode(pinPot, INPUT); pinMode(pinLed, OUTPUT); pinMode(pinBtn, INPUT_PULLUP); Serial.begin(9600); Serial.println("The program starts.\n\n"); } void loop() { /* INITIAL VARIABLES. Segment 1 */ static char potMes[] = "Pot - "; static char btnMes[] = "Button is pressed!"; static char passLight[] = "Led - "; static int passLength = sizeof(passLight) - 1; static int sizepm = sizeof(potMes) - 1; static int sizebtn = sizeof(btnMes) - 1; static bool flagLedState = LOW; static bool flagBtnPress = false; static long int curTime = 0; static const int period = 200; static bool flagEnableRead = false; /* INITIAL VARIABLES. Segment 1 */ /* FUNCTIONS CALL. Segment 2 */ /* * Led is attached to HIGH voltage from one side * And to pin on the other side * By that the inverting logic */ ReadSerialForLed(passLight, passLength, &flagLedState); digitalWrite(pinLed, !flagLedState); /* * Button pin always is pulled to the HIGH voltage * And only when button is pressed - Voltage on pin goes to GROUND * So it is need to invert logic when read pins */ if(!Bounce(pinBtn) && flagBtnPress == false){ for(int i = 0; i < sizebtn; i++){ Serial.write(btnMes[i]); } Serial.print("\n"); flagBtnPress = true; if(!flagEnableRead){ curTime = millis(); flagEnableRead = true; } }else if(Bounce(pinBtn)){ flagBtnPress = false; } /* * Read and send Info "Pot - " + var Only after first press on button * Every 'period'ms */ if(millis() - curTime > period && flagEnableRead){ SendData(pinPot, potMes, sizepm); curTime = millis(); } /* FUNCTIONS CALL. Segment 2 */ } /* * Pot - pin with potentiometer * pMes - Array with message before Pot value * sp - size of potentiometer message */ void SendData(int Pot, char* pMes, int sp){ static int varP[2]; varP[0] = analogRead(Pot); varP[1] = varP[0]/256; // 0 - 3 (256 - 1024) varP[0] = varP[0]%256; // 0 - 255 //Send Message for(int i = 0; i < sp; i++){ Serial.write(char(pMes[i])); } //Send 2 bits of data //Serial.write(varP[0]); //Serial.write(varP[1]); Serial.print(analogRead(Pot)); Serial.print("\n"); } /* * Function, which is reads button pin with the bounce */ bool Bounce(int btn){ if(digitalRead(btn) == true){ delay(15); if(digitalRead(btn) == true){ return true; }else{ return false; } }else{ return false; } } /* * If Message from Serial port, which you read will be the same to passLight * So look at the next symbol after Pass Message. If it is symbol 'H' - make LED to light * If it is 'L' - make LED off. */ void ReadSerialForLed(char *passLight_f, int passLength_f, bool* flagLedState_f){ static char sym; static int cntPass = 0; static bool readyGetLed = LOW; while (Serial.available() > 0) { sym = Serial.read(); if(sym == passLight_f[cntPass] && !readyGetLed){ cntPass++; }else if (!readyGetLed){ cntPass = 0; }else if(readyGetLed){ if(sym == 'H'){ *flagLedState_f = HIGH; }else if(sym == 'L'){ *flagLedState_f = LOW; } } if(cntPass == passLength_f){ readyGetLed = HIGH; } } }
Comentário: O LED está conectado à fonte de alimentação pelo ânodo. Isso inverte a lógica do estado do LED e não se beneficia mais. O botão não está preso a um resistor pull-up por razões econômicas, pois o Arduino Uno possui resistores pull-up integrados que são incluídos no circuito quando o pino é inicializado no modo INPUT_PULLUP.
Também no firmware, as mensagens sobre o valor obtido no potenciômetro são enviadas somente após o primeiro pressionamento de um botão!Para preencher o firmware na placa, não esqueça de selecionar a porta e a placa.

Se você não souber qual porta COM você possui para a placa Arduino, no Windows, vá para
Painel de controle -> Gerenciador de dispositivos e clique na guia "Portas COM"

Se a sua porta COM não estiver assinada como a minha, você sempre poderá desconectar o Arduino e ver qual porta está desativada. Mas se ninguém desapareceu e o Arduin não é reconhecido pelo computador, é hora de procurar uma solução na Internet. Mas comece atualizando os drivers ou alterando o quadro.
Quando tudo der certo, tente abrir o monitor da porta e digitar “Led-H”, “Led-L”, pressione o botão, gire o potenciômetro e observe a tela para ver se tudo está sendo exibido corretamente.
Jogaram o suficiente - altere ligeiramente o código.
Substitua a última linha pelo código do comentário.
Agora, os valores do potenciômetro não parecerão legíveis, mas essa manobra é necessária para o programa de processamento.
Processando. Estamos escrevendo um programa que interage com um microcontrolador
A essência da comunicação entre o programa Processing e o microcontrolador é muito simples. Existe uma biblioteca Serial para essa linguagem de programação, que permite receber mensagens enviadas como
Serial.write();
e também permite enviar mensagens como
Serial.print();
. É importante observar que, com essa mensagem enviada, ela será gravada no buffer da porta, o que significa que será lida pelo microcontrolador. Portanto, apenas precisamos conectar à porta serial desejada e receber / enviar mensagens a ela.
O programa a seguir conectará a biblioteca Serial e gravará no console do editor uma lista de todas as portas COM às quais você pode se conectar.
import processing.serial.*; void setup() { String[] port = Serial.list(); for(int i = 0; i < port.length; i++){ print("Port number #" + i + " "); println(Serial.list()[0]); } } void draw() {}
Quando você escreve o código no editor e clica no botão “Iniciar” (seta 1 na imagem), a janela do aplicativo aparecerá (2) e a lista de portas COM será exibida no console (3).

Eu tenho apenas uma dessas portas COM e, na planilha, como na matriz, ela estará no número 0. Por esses motivos, o objeto da classe
Serial port;
:
Serial port;
quando criado, será especificado o primeiro elemento da lista de
port = new Serial(this, Serial.list()[0], 9600);
Despeje no Arduin nosso firmware mais recente com uma alteração. Em seguida, escreva este programa e execute-o. A cada 500 milissegundos, uma mensagem é enviada à porta COM para apagar ou acender o LED. E se tudo for feito corretamente, depois de iniciar o aplicativo, o LED deverá piscar.
import processing.serial.*; Serial port;
Ou aqui está outro exemplo. O LED mudará de estado após qualquer clique na janela do aplicativo (cujas dimensões são 800x800px) com o botão do mouse.
import processing.serial.*; Serial port;
Processando. Exemplo de aplicativo rico em recursos
Este aplicativo elementar simula um "vôo no espaço", se é que você pode chamar assim. O valor do potenciômetro altera a velocidade do vôo, pressionando o botão altera a direção do vôo. E qualquer clique no botão do mouse na janela do aplicativo altera o estado do LED (sim, não criei nada mais original).
Meu código está longe de ser perfeito, não o tome como um bom exemplo. Este é apenas um exemplo que funciona. Aqui está ele.
Exemplo de programa multifuncional import processing.serial.*; Serial port;
Conclusão
Eu acho que é necessário escrever que peguei a idéia do último programa de um programador -
Daniel Shiffman , que grava vídeos que são compreensíveis até para crianças sobre a programação no Processing (
mais de 140 tarefas visuais foram resolvidas ).
Quando tentei descobrir o que e como fazer as comunicações Processing e Arduino, esses sites realmente me ajudaram:
- developer.alexanderklimov.ru/arduino/processing.php
- arduino-diy.com/arduino-processing-osnovi