Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Escolha para iluminar o projeto 2 WiFi

Componentes e suprimentos

Arduino MKR1000
× 1
LED (genérico)
× 2
Fios de jumpers (genérico)
× 1
SparkFun Botão de pressão 12 mm
× 1
Resistor 10k ohm
× 1
Resistor 330 ohm
× 4
Breadboard (genérico)
× 1
Cabo USB-A para Micro-USB
× 1
Transistor de uso geral NPN
× 1

Sobre este projeto


Este é o segundo projeto que escolhi para explorar a luz. No primeiro, descrevi como vejo um simples pick to light funcionando e criei um simples pick to light usando comunicação serial (por favor, leia isto se quiser entender mais o que estou fazendo aqui).



Funcionou, mas estava conectado ao PC pelo cabo. Neste projeto, quero desenvolver o processo usando Wi-Fi e, além disso, quero incluir o número de sequência na confirmação de coleta para que, se algo der errado, o sistema saiba para onde o trabalhador fez a coleta. Vou usar um MKR1000 da mesma maneira que fiz no projeto 1, mas me comunicar usando wi-fi. Para fazer isso, vou usar o UDP (User Datagram Protocol). Embora eu nunca tenha usado isso antes, graças às bibliotecas do Arduino e do Python, ele provou ser relativamente fácil de criar.

As etapas a seguir são bastante semelhantes ao projeto 1, portanto, se você as seguiu, já estará familiarizado com algumas das etapas e não será necessário repeti-las.





Etapa 1


Para começar, precisamos ter o Python v 3.6 ou superior em nosso laptop ou pc. Você pode fazer o download aqui:

https://www.python.org/downloads/





Etapa 2


Desta vez, usaremos a biblioteca de soquetes Python para comunicação e ela já está instalada, portanto, nada precisa ser feito para fazer o UDP funcionar.





Etapa 3


Também precisamos do IDE do Arduino, seja a versão para PC ou a versão para a web. Eles podem ser baixados aqui:

https://www.arduino.cc/en/Main/Software

ou conectado aqui:

https://create.arduino.cc/

As instruções no site são abrangentes, por isso não as duplicarei desnecessariamente.





Etapa 4


Inicie o Python IDLE em seu PC ou laptop e digite:import os pressione:enter.

Em seguida, digite:os.getcwd () que deve fornecer seu diretório de trabalho atual (cwd).



Diretório de trabalho Python






Etapa 5


No bloco de notas, criei um arquivo de valores separados por vírgulas e ele simplesmente contém um número de sequência formatado para sempre ter 4 dígitos e um número bin separado por uma vírgula. Veja a captura de tela do Bloco de notas abaixo e também o arquivo de texto anexado que você pode baixar. Salvei isso como sequence1.txt no cwd que reunimos na etapa 4 (você pode salvar o arquivo com a extensão csv, mas não é necessário para o csv funcionar). Salvar o arquivo no cwd simplifica as coisas quando passamos a ler o arquivo com o script python, já que não teremos que especificar um local onde o arquivo está armazenado porque ele irá procurar automaticamente no cwd.





arquivo txt contendo a sequência csv





Etapa 6


Usaremos serial no esboço do Arduino, mas apenas para que possamos ver as mensagens impressas no monitor serial.








Etapa 7


O script Python precisa ler o conteúdo do arquivo csv uma linha por vez e enviar o número de sequência e o número Bin pela conexão UDP e então esperar até que o Arduino retorne a confirmação, que é o número de sequência do último número bin , para dizer que a parte foi escolhida. Se o número de sequência recebido não corresponder ao último número de sequência enviado, o programa Python irá parar com uma mensagem de erro indicando o número de sequência. Isso permitirá que a sequência seja reiniciada no local correto. Eu adicionei comentários ao script para que você possa entender o que escrevi.

Copie o script e, em seguida, execute o IDLE e, em seguida,> Arquivo> Novo arquivo e cole o script na janela. Em seguida,> Arquivo> Salvar como, dê um nome a ele (não importa como você o chame, desde que você saiba o nome).





Etapa 8


O esboço do Arduino precisa se conectar à Internet e esperar para receber os dados udp do PC para a próxima escolha. Em seguida, atua sobre o que recebe, acendendo o LED que corresponde à caixa na sequência. Em seguida, ele precisa monitorar o botão que representa essa caixa para ver se está pressionado. Assim que o trabalhador pressiona o botão para dizer que a peça foi escolhida, o esboço apaga o LED e envia uma mensagem contendo o último número de sequência de volta ao PC ou laptop para dizer que a peça foi escolhida. Em seguida, espera receber os detalhes para a próxima escolha.

Então, se você estiver usando o editor da web do Arduino, copie abaixo do esboço e no editor da web do Arduino selecione> caderno> NOVO ESBOÇO



Arduino Web Editor

Em seguida, cole o script no novo esboço, substituindo completamente tudo o que está lá.

Se você estiver usando o editor da web do Arduino, assim que colar o esboço, o editor identifica a necessidade de criar um arquivo secreto que conterá o SSID e a senha desse servidor.

É apenas um caso simples de adicionar os detalhes relevantes ao arquivo nos espaços fornecidos.

Com o Arduino IDE pode ser tão fácil, mas se fosse, não consegui encontrar. No entanto, porque comecei meu esboço com o esboço de exemplo WiFiUdpSendReceiveString.

Se você abrir, encontrará uma guia arduino_secrets.h já dentro dela. Adicione seu SSID e senha e cole o esboço abaixo sobre o esboço já existente e salve com o nome que desejar.

Se estiver usando o Arduino IDE, você precisará incluir a biblioteca WiFi101. O link a seguir explica como adicionar uma biblioteca, caso não saiba.

https://www.arduino.cc/en/Guide/Libraries

Baixe para o MKR1000.





Etapa 9


Conecte tudo de acordo com o diagrama fritzing. Se você seguiu o projeto 1, verá que o conectei de maneira diferente. A razão por trás disso é que assim que o WiFi no MKR1000 se torna ativo por algum motivo, a energia cai nos pinos 8 e 9 e os LEDs não acendem. Não consegui encontrar ninguém na web postando nada sobre esse problema, então usei o transistor para contornar o problema. Tenho certeza de que haverá uma explicação para isso, mas até agora não a encontrei.

Aviso! Certifique-se de que os resistores que você usa são adequados para o LED e o transistor NPN que você usa. Certifique-se também de fazer a fiação correta, pois permitir que os 5 V entrem em curto entre os pinos 8 e 9 podem destruir seu Arduino. Use um diodo se não tiver certeza.








Etapa 10


Verifique se o Arduino está conectado ao servidor e execute o script Python usando F5 e o LED que representa Bin1 acenderá. Pressionar o botão para confirmar que a parte foi escolhida enviará o número da sequência de volta ao programa Python, onde será verificado e, se estiver correto, a próxima sequência será enviada.

A saída do Python será parecida com esta



A saída do monitor serial será semelhante a esta:





Você pode testar a falha de sequência comentando a linha:

myseq.toCharArray (ReplyBuffer, 5);

e removendo o comentário da linha:

// char ReplyBuffer [5] ="0001";

do seguinte modo;

Ao executar o programa python agora, a execução será interrompida após o segundo compartimento, pois relatará o número de sequência do primeiro compartimento.



No caso de uma falha na sequência, a pessoa que cria a sequência precisa editar o arquivo que contém a sequência e reiniciar o arduino e o programa Python.





Conclusão


Bem, acho que consegui o que me propus a fazer. É simples e fácil de aumentar para uma versão de trabalho em tamanho real. No entanto, já posso ver que um projeto 3 pode fazer melhorias e mesmo que a competição tenha acabado, antes que eu tenha a chance de fazer outro projeto, acho que gostaria de fazer isso para ver como posso torná-lo melhor, mas ainda assim mantendo a ideia inicial de simplicidade.


Código

  • esboço do Arduino
  • Script Python
  • Sequência
Esboço do Arduino Arduino
O esboço a ser carregado no MKR1000
 #include  #include  #include  const int OKbutton =2; // define o pino para o botão / switchconst int Bin1 =8; // o pino que o LED para bin 1 está conectado toconst int Bin2 =9; // o pino em que o LED do compartimento 2 está conectado aString mydata =""; // uma variável para ler os dados seriais de entrada configurada como vazia stringString myseq =""; int buttonPress =0; // uma variável para armazenar o estado do botão / switchint status =WL_IDLE_STATUS; #include "arduino_secrets.h" /////// insira seus dados confidenciais na guia Segredo / arduino_secrets.hchar ssid [] =SECRET_SSID; // SSID da sua rede (nome) char pass [] =SECRET_PASS; // sua senha de rede (use para WPA, ou use como chave para WEP) int keyIndex =0; // o número do índice da sua chave de rede (necessário apenas para WEP) unsigned int localPort =2390; // porta local para escutar onchar packetBuffer [255]; // buffer para armazenar o pacote de entrada ReplyBuffer [5] =""; // uma string para enviar backString mystring; WiFiUDP Udp; void setup () {// Inicializar serial e esperar a porta abrir:Serial.begin (9600); // todas as instruções seriais não são necessárias uma vez configuradas // while ( ! Serial) {// aguarde a conexão da porta serial. Necessário apenas para porta USB nativa} // verifique a presença do escudo:if (WiFi.status () ==WL_NO_SHIELD) {Serial.println ("escudo WiFi não presente"); // não continue:while (true); } // tentativa de conexão à rede WiFi:while (status! =WL_CONNECTED) {Serial.print ("Tentando conectar ao SSID:"); Serial.println (ssid); // Conecte-se à rede WPA / WPA2. Altere esta linha se estiver usando rede aberta ou WEP:status =WiFi.begin (ssid, pass); // aguarde 10 segundos pela conexão:delay (10000); } Serial.println ("Conectado a wi-fi"); printWiFiStatus (); Serial.println ("\ nIniciando conexão com o servidor ..."); // se você obtiver uma conexão, reporte via serial:Udp.begin (localPort);} void loop () {// se houver dados disponíveis, leia um pacote int packetSize =Udp.parsePacket (); if (packetSize) {Serial.print ("Tamanho de pacote recebido"); Serial.println (packetSize); Serial.print ("De"); IPAddress remoteIp =Udp.remoteIP (); Serial.print (remoteIp); Serial.print (", porta"); Serial.println (Udp.remotePort ()); // lê o pacote em packetBufffer int len ​​=Udp.read (packetBuffer, 255); if (len> 0) packetBuffer [len] =0; Serial.println ("Conteúdo:"); Serial.println (packetBuffer); String mystring (packetBuffer); mydata =mystring.substring (4); myseq =mystring.substring (0,4); Serial.println (mydata); Serial.println (myseq); while (mydata! ="") {// Teste para ver se mydata ainda está vazio se não estiver verifique qual bin deve estar aceso if (mydata =="Bin1") {// iniciar rotina bin 1 digitalWrite (Bin1 , ALTO); // acende o LED para o compartimento 1 configurando o pino alto digitalWrite (Bin2, LOW); // desligue o LED do compartimento 2, definindo o pino baixo while (buttonPress! =HIGH) {// aguarde o loop de pressão do botão buttonPress =digitalRead (OKbutton); // continue verificando o botão mydata =""; // definir mydata de volta para string vazia} digitalWrite (Bin1, LOW); // desligar o led para bin 1 Serial.println ("Selecionado"); // enviar mensagem para o PC buttonPress =0; // botão reset low delay (1000); } if (mydata =="Bin2") {// inicia a rotina do bin 2 digitalWrite (Bin2, HIGH); // acende o LED para o bin 2 configurando o pino alto digitalWrite (Bin1, LOW); // desligue o LED do compartimento 1 definindo o pino baixo while (buttonPress! =HIGH) {// aguarde o loop de pressão do botão buttonPress =digitalRead (OKbutton); // continue verificando o botão mydata =""; // definir mydata de volta para a string emty} digitalWrite (Bin2, LOW); // desligue o led do compartimento 1 Serial.println ("Selecionado"); // enviar mensagem para o PC buttonPress =0; // botão reset low delay (1000); }} // envia uma resposta, para o endereço IP e porta que nos enviou o pacote que recebemos myseq.toCharArray (ReplyBuffer, 5); // char ReplyBuffer [5] ="0001"; // para teste apenas Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (ReplyBuffer); Udp.endPacket (); Serial.println (ReplyBuffer); }} void printWiFiStatus () {// imprime o SSID da rede à qual você está conectado:Serial.print ("SSID:"); Serial.println (WiFi.SSID ()); // imprime o endereço IP do seu escudo WiFi:IPAddress ip =WiFi.localIP (); Serial.print ("Endereço IP:"); Serial.println (ip); // imprime a intensidade do sinal recebido:long rssi =WiFi.RSSI (); Serial.print ("intensidade do sinal (RSSI):"); Serial.print (rssi); Serial.println ("dBm");} 
Script Python Python
Script Python a ser executado.
 ## carregar as bibliotecas necessárias csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## o ip do nosso ArduinoUDP_PORT =2390 ## a porta que desejamos comunicar na impressão ("IP de destino UDP:" , UDP_IP) ## display ip to userprint ("UDP target port:", UDP_PORT) ## display port to usersock =socket.socket (socket.AF_INET, socket.SOCK_DGRAM) # criar um sockettime.sleep (5) ## open arquivo csv e lê-lo em uma linha por tempo com open ('sequence1.txt') como csvDataFile:csvReader =csv.reader (csvDataFile) para linha em csvReader:## para cada linha faça o seguinte myseq =linha [0] # #lida no número de sequência mystate =row [1] ## read in the bin number myrow =linha [0] + linha [1] print ("Sequência atual sendo escolhida", myseq, "from", mystate) sock.sendto (bytes (myrow, "utf-8"), (UDP_IP, UDP_PORT)) # enviar dados de número de seq e bin ="" # definir dados em branco para inserir while loop i =até que os dados sejam recebidos enquanto dados =="":# até que os dados sejam recebidos, continue repetindo (dados, addr) =soc k.recvfrom (1024) # definir dados para dados recebidos de socket mytest =data.decode ("utf-8") #set mytest para igual valor recebido sobre socket print ("pick =", mytest) # imprimir o valor recebido se mytest! =myseq:# testar o que foi recebido corresponde ao esperado, ou seja, último seq enviado print ("há uma falha de sequência na sequência", mytest) # exibir mensagem para indicar uma falha sys.exit () #end execução do programa se existe falha 
Sequência Texto simples
Arquivo de sequência para o programa Python
 0001, Bin10002, Bin20003, Bin10004, Bin20005, Bin10006, Bin20007, Bin10008, Bin20009, Bin10010, Bin20011, Bin10012, Bin20013, Bin1 

Esquemas

Conexões para o UDP Pick to Light picktolightudp_OCbpNt9XPK.fzz

Processo de manufatura

  1. Lanterna a gás
  2. Ponteiro Laser
  3. Lanterna
  4. Caleidoscópio
  5. Laser semicondutor
  6. Fotografia
  7. Sinal de trânsito
  8. Lâmpada
  9. Sensor de obstáculo simples com Arduino
  10. Speed ​​Pick e pedal de pedal da guitarra!