Pneumatic Pick and Place.
Brazo giratorio utilizado en anteriores montajes pero con una ventosa en su punta. Coge fichas de damas colocadas al azar en una columna y las va amontonando en 2 columnas según color.
Dispone de 2 motores PAP, una bomba de aire, una válvula solenoide y de un sensor de luz al que se ha añadido un led. Una tarjeta de leds nos indica el estado de la bomba y válvula.
Video en acción
Para quien pueda interesar aquí está el código
#include "MeOrion.h"
#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
AccelStepper eje(AccelStepper::DRIVER, 10, 11); // 10-PUL,11-DIR
// corresponde al PORT_1, eje
AccelStepper brazo(AccelStepper::DRIVER, 9, 3); // 9-PUL,3-DIR
// corresponde al PORT_2, brazo
MeLightSensor sensor_luz(PORT_7);
MeDCMotor bomba(M1);
MeDCMotor valvula(M2);
MeRGBLed led(PORT_8);
int h_carga= 0, h_sup= -2700; // con 6 fichas
int h_sensor= -1250;
int h_descarga_b =1100, h_descarga_n =1100;
int ang_sensor= -5100, ang_carga=0;
int ang_1= -1700, ang_2=-3400;
int tpo=600;
int fichas = 6;
int piso = 300;
int reflejo; //variable para el sensor de luz
int umbral =800; // para distinguir reflejo
int fuerza =150; // fuerza succion
bool flag;
int no; // numero de ficha
//==================================
void setup() {
Serial.begin(9600);
eje.enableOutputs();
eje.setMaxSpeed(10000);
eje.setAcceleration(10000);
eje.setCurrentPosition(0);
brazo.enableOutputs();
brazo.setMaxSpeed(10000);
brazo.setAcceleration(10000);
brazo.setCurrentPosition(1);
led.setColorAt(0, 0,0,0);
led.setColorAt(2, 0,0,0);
led.setColorAt(1, 0,0,0);
led.setColorAt(3, 0,0,0);
led.show();
}
//==================================
void loop() {
Serial.println("Empezamos");
//aviso();
for (no=1;no<=fichas;no++){
mover_brazo(h_carga+(piso*no));
succion(1);
mover_brazo(h_sup); //
girar_eje(ang_sensor);
mover_brazo(h_sensor);
delay(tpo);
checkColor();
mover_brazo(h_sup);
if (reflejo > umbral){deja_blanca();}
else {deja_negra();}
mover_brazo(h_sup);
girar_eje(ang_carga);
}
while(1){};
}
//=================================
void deja_blanca(){
Serial.println(" Blanca");
girar_eje(ang_1);
mover_brazo(h_descarga_b);
succion(0);
delay(tpo);
h_descarga_b = h_descarga_b-piso;
}
void deja_negra(){
Serial.println(" Negra");
girar_eje(ang_2);
mover_brazo(h_descarga_n);
succion(0);
delay(tpo);
h_descarga_n = h_descarga_n-piso;
}
void succion(bool flag){
delay(100);
if(flag){ // succiona
valvula.stop();
led.setColorAt(1, 0,100,0);// valvula abierta
bomba.run(fuerza);
led.setColorAt(3, 100,0,0);// bomba activa
led.show();
delay(tpo);
}else{ // no succiona
valvula.run(255);
led.setColorAt(1, 100,0,0);// valvula cerrada
bomba.stop();
led.setColorAt(3, 0,100,0);// bomba en paro
led.show();
delay(tpo);
valvula.stop();
led.setColorAt(1, 0,100,0);// valvula abiera
led.show();
}
}
void girar_eje(int angulo){
eje.moveTo(angulo); //
while (eje.currentPosition() != angulo)
{eje.run();}
delay(tpo);
}
void mover_brazo(int posicion){
brazo.moveTo(posicion); //
while (brazo.currentPosition() != posicion) // se posiciona para cargar
{brazo.run();}
delay(tpo);
}
int checkColor(){ //medir reflejo
reflejo = sensor_luz.read();
Serial.print("Ficha " );
Serial.print(no);
Serial.print(" Reflejo = " );
Serial.print(reflejo);
return reflejo;
}
void aviso(){ // aviso sonoro
for(int i = 0; i < 4; i++){
buzzerOn();
delay(10);
buzzerOff();
delay(10);
}
}
Inspirado en uno de Kreativadelar.se
_**Pneumatic Pick and Place.**_
Brazo giratorio utilizado en anteriores montajes pero con una ventosa en su punta. Coge fichas de damas colocadas al azar en una columna y las va amontonando en 2 columnas según color.

Dispone de 2 motores PAP, una bomba de aire, una válvula solenoide y de un sensor de luz al que se ha añadido un led. Una tarjeta de leds nos indica el estado de la bomba y válvula.
[Video en acción](https://vimeo.com/218121962 "Vimeo")
--
Para quien pueda interesar aquí está el código
````
#include "MeOrion.h"
#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
AccelStepper eje(AccelStepper::DRIVER, 10, 11); // 10-PUL,11-DIR
// corresponde al PORT_1, eje
AccelStepper brazo(AccelStepper::DRIVER, 9, 3); // 9-PUL,3-DIR
// corresponde al PORT_2, brazo
MeLightSensor sensor_luz(PORT_7);
MeDCMotor bomba(M1);
MeDCMotor valvula(M2);
MeRGBLed led(PORT_8);
int h_carga= 0, h_sup= -2700; // con 6 fichas
int h_sensor= -1250;
int h_descarga_b =1100, h_descarga_n =1100;
int ang_sensor= -5100, ang_carga=0;
int ang_1= -1700, ang_2=-3400;
int tpo=600;
int fichas = 6;
int piso = 300;
int reflejo; //variable para el sensor de luz
int umbral =800; // para distinguir reflejo
int fuerza =150; // fuerza succion
bool flag;
int no; // numero de ficha
//==================================
void setup() {
Serial.begin(9600);
eje.enableOutputs();
eje.setMaxSpeed(10000);
eje.setAcceleration(10000);
eje.setCurrentPosition(0);
brazo.enableOutputs();
brazo.setMaxSpeed(10000);
brazo.setAcceleration(10000);
brazo.setCurrentPosition(1);
led.setColorAt(0, 0,0,0);
led.setColorAt(2, 0,0,0);
led.setColorAt(1, 0,0,0);
led.setColorAt(3, 0,0,0);
led.show();
}
//==================================
void loop() {
Serial.println("Empezamos");
//aviso();
for (no=1;no<=fichas;no++){
mover_brazo(h_carga+(piso*no));
succion(1);
mover_brazo(h_sup); //
girar_eje(ang_sensor);
mover_brazo(h_sensor);
delay(tpo);
checkColor();
mover_brazo(h_sup);
if (reflejo > umbral){deja_blanca();}
else {deja_negra();}
mover_brazo(h_sup);
girar_eje(ang_carga);
}
while(1){};
}
//=================================
void deja_blanca(){
Serial.println(" Blanca");
girar_eje(ang_1);
mover_brazo(h_descarga_b);
succion(0);
delay(tpo);
h_descarga_b = h_descarga_b-piso;
}
void deja_negra(){
Serial.println(" Negra");
girar_eje(ang_2);
mover_brazo(h_descarga_n);
succion(0);
delay(tpo);
h_descarga_n = h_descarga_n-piso;
}
void succion(bool flag){
delay(100);
if(flag){ // succiona
valvula.stop();
led.setColorAt(1, 0,100,0);// valvula abierta
bomba.run(fuerza);
led.setColorAt(3, 100,0,0);// bomba activa
led.show();
delay(tpo);
}else{ // no succiona
valvula.run(255);
led.setColorAt(1, 100,0,0);// valvula cerrada
bomba.stop();
led.setColorAt(3, 0,100,0);// bomba en paro
led.show();
delay(tpo);
valvula.stop();
led.setColorAt(1, 0,100,0);// valvula abiera
led.show();
}
}
void girar_eje(int angulo){
eje.moveTo(angulo); //
while (eje.currentPosition() != angulo)
{eje.run();}
delay(tpo);
}
void mover_brazo(int posicion){
brazo.moveTo(posicion); //
while (brazo.currentPosition() != posicion) // se posiciona para cargar
{brazo.run();}
delay(tpo);
}
int checkColor(){ //medir reflejo
reflejo = sensor_luz.read();
Serial.print("Ficha " );
Serial.print(no);
Serial.print(" Reflejo = " );
Serial.print(reflejo);
return reflejo;
}
void aviso(){ // aviso sonoro
for(int i = 0; i < 4; i++){
buzzerOn();
delay(10);
buzzerOff();
delay(10);
}
}````
Inspirado en uno de Kreativadelar.se
editado 6 Jun '17 a las 11:11 am