Reto:
Temos unha fichas brancas e negras, e queremos separalas e depositalas en caixas diferentes.
Montaxe:
Hai na rede moitas ideas de deseños que se poden facer de cartón, madeira ou plástico, de feito xa tiñamos un de cartón montado, pero resulta moi pouco preciso. Como este curso nos quedou pouco tempo para os proxectos, decidimos utilizar un kit comercial que programaremos e ampliaremos con máis elementos.
Substituímos o sensor de cor dixital que tiña por un sensor TCRT5000 que permite unha lectura analóxica. Isto permítenos distinguir entre ficha branca, ficha negra, ou ausencia de fichas, o cal nos vai resultar útil para parar o sistema unha vez se terminen as fichas do tubo.
Utiliza o arduino sen a shield e unha protoboard e fai as conexións necesarias. Deixa espazo para engadir posteriormente outros elementos.
Sistema inicial:
- Módulo TCRT5000 no pin analóxico A0
- ServoBrazo no pin 12
- ServoCor no pin 11
- Pulsador no pin 2 + resistencia de 10k
Sistema ampliado:
Sistema con calibración e LEDs:
- Pulsador no pin 3 + resistencia de 10k
- LEDs indicadores: ledMarcha verde no pin 9, ledParada vermello no pin 8, ledCalibrado ámbar ou azul no pin 7.
Programación:
Consultar previamente:
Test previo:
- Antes de comezar fai unha lectura dos valores que dá o sensor cando hai unha peza branca, unha peza negra e cando non hai peza ningunha. Segundo eses valores deberás establecer uns rangos que determinarán o comportamento do sistema neses casos.
// Valores lidos (por exemplo) int lecturaBranco = 30; int lecturaNegro = 450; int lecturaNada = 600; // Cálculo dos rangos: branco < rangoBN < negra < rangoFichas < nada int rangoBN = lecturaBranco + (lecturaNegro - lecturaBranco)/2; int rangoFichas = lecturaNegro + (lecturaNada - lecturaNegro)/2;
Programa:
Definir os parámetros
- Debes incluír dous servos, un servo “ServoBrazo” para a peza que transfire as fichas desde o tubo ata o brazo, e o servo “ServoCor” que se encarga de depositalas nas caixas situadas á esquerda e á dereita.
- Para a montaxe que temos no taller definimos os seguintes ángulos.
// Ángulos ServoBrazo (Servo que expulsa a peza) int ang_atras = 60; int ang_expulsar = 10; // Ángulos ServoCor (Servo que separa brancas de negras) int ang_negra = 0; int ang_medio = 65; int ang_branca = 130;
- Define un tempo de espera entre procesos e outro tempo para o xiro dos servos, que controle a súa velocidade.
- Define unha variable nivelCor que se vai encargar de almacenar a lectura analóxica do sensor conectado no pin A0.
Configuración inicial
- Indica os pins nos que están conectados os servos: ServoCor no pin 11 e ServoBrazo no pin 12.
- Establece a comunicación serie para visualizar o proceso na consola.
Loop
O programa máis simple é o que arranca nada máis acender a placa e non para ata que a desconectemos. Imos utilizalo como base e despois iremos engadindo algunhas melloras.
- Fíxate no seguinte diagrama de fluxo. Primeiro miramos a cor da peza, despois o primeiro servo transfire a ficha ata o brazo e, en función da lectura do sensor, deposita a peza á esquerda ou á dereita. Engade ao diagrama de fluxo o necesario para que cando non haxa ningunha peza o sistema pare e prográmao.
- Para o movemento dos servos utiliza un programa que faga que se desprace pouco a pouco ata a posición final e despois volva pouco a pouco ata a inicial. Axustando a variable tempo de xiro que creaches no inicio controlaremos a velocidade dos servos, e axustarémola ata que logremos que as pezas non saian disparadas.
- Podes definir aparte as funcións transferir(), depositarBranca() e depositarNegra() para programar os movementos, e chamalas desde o programa principal.
- Utiliza a consola para ir vendo o proceso (cor das fichas, movementos dos brazos, etc.) de maneira que te axude a corrixir os posibles fallos.
Propostas de mellora:
- Pulsador: Imos engadir un pulsador no pin 2. Cando acendemos a placa o programa arrancará no momento en que premamos no pulsador, e non antes.
- Contador na consola: engade o necesario para visualizar na consola cantas fichas brancas e negras contou e o total.
- Contador nunha pantalla LCD: Engade unha pantalla LCD na que se mostre cantas pezas brancas e negras clasificou.
- Pulsador con memoria: Fai que a máquina arranque ao premer no botón e que pare cando prememos de novo premendo durante un tempo.
Se queremos parar a máquina manualmente cando prememos de novo o pulsador debemos definir unha variable “estado” que garde na memoria se está en ON ou en OFF, e que cambie cada vez que prememos. Está explicado na sección de detección de pulsos “memoria“. A variable na que almacenas a información pode ser booleana e dar coma resultado dous estados: true e false.bool estado_OnOff = false;
- Calibración: Engade un segundo pulsador. No inicio, antes de arrancar a máquina cos parámetros preestablecidos, se prememos neste pulsador procede á calibración dos niveis de luz do sensor para detectar pezas brancas, negras e ausencia de pezas. En función dos valores que lea calcula os valores de rango para que a máquina actúe e actualiza os parámetros. Ao premer no pulsador principal a máquina funcionará cos novos valores. As instrucións deberán lerse na pantalla LCD.
void Calibracion(){ // (Instrucións a través da consola serie) Serial.println("Imos proceder a calibrar"); Serial.println("Elimina todas as fichas e preme no botón de calibrado"); while (digitalRead(calibradoPin)==0 ); // Agarda mentres non está premido delay(20); while (digitalRead(calibradoPin)==1 ); // Agarda mentres está premido delay(50); lecturaNada = analogRead(A0); // Fai a lectura e garda o valor Serial.println("lectura sen fichas= " + String(lecturaNada)); // Continúa ti ... }
- LEDs indicadores: Engade uns LEDs que indiquen o estado do sistema: ledMarcha verde no pin 9, ledParada vermello no pin 8, ledCalibrado azul no pin 7.
Para complicalo máis:
- Límite: Poderiamos establecer un límite de fichas que a máquina debe clasificar. A máquina deterase automaticamente ao alcanzar ese límite. 30 fichas é o máximo que entra na máquina. Podes probar que o sistema pida ao usuario introducir este dato desde a consola, e que actúe segundo ese parámetro. Outra opción podería ser usar un mando IR para introducir o número de fichas que desexas.
- Interrupcións: No programa de pulsador con memoria observarás que debes manter un tempo o botón premido para que detecte o pulso e pare. Iso é porque podes premer cando está realizando un proceso (clasificar a ficha, por exemplo), e non lerá o sinal do pulsador ata que o termine. Unha maneira de corrixir isto é mediante interrupcións. Atréveste?
Deseño 3D:
A protoboard é unha placa de prototipado para compobar o funcionamento do sistema mentres estás en proceso de deseño, probas e melloras, pero non é conveniente deixalo así se o proxecto está rematado. Deseña e imprime un soporte que integre a pantalla LCD (ver esquema), dous pulsadores (toma medidas do diámetro) e os tres leds indicadores (5mm). Fai as conexións internas necesarias e etiqueta os cables que se conectarán ao arduino de xeito que se vexa en que pins hai que conectalos.
Medidas LCD:
Tamén podes deseñar e imprimir unhas caixas para recoller as pezas. Colle as dimensións da máquina e fai que encaixe e que as recolla ben, sen que saian disparadas.
Exemplos:
Modelo básico utilizando antes da ampliación. Utiliza o sensor dixital inicial e unha shield.
Resultado final con sensor analóxico, dous pulsadores, LCD e leds. Permite calibración inicial antes de clasificar, mostra as fichas contadas na pantalla e detense automaticamente cando o tubo está baleiro.