Electrónica y Programación en Personal
«Si no se soluciona con un script en Python entonces no es viable»

por Yeison Cardona el 14 de junio de 2012 a las 16:15 UTC



*Tomado de Wikipedia



Código en Pinguino:
Seleccionar la arquitectura de su tarjeta Pinguino:
Éste código es el visto en éste post.
/*-----------------------------------------------------
Author:  Yeison Cardona --
First release: 05/03/2012
Last release: 11/05/2012
Description: Control de la tarjeta pinguino mediante
comandos transparentes enviados por CDC.
-----------------------------------------------------*/

#include 
#include 
#define TotalPines 17
 
char lectura[21], *bloque;
int par1, valor, cont, i;
 
void setup() {
 }

void leer_cadena() {
    unsigned char valor_leido[21];
    unsigned char receivedbyte;
    int cont=1;
    while (cont){    
        receivedbyte=CDC.read(valor_leido);
        valor_leido[receivedbyte]=0;
        if (receivedbyte>0) cont=0;}
    strcpy(lectura,valor_leido);}
  
void loop() {
 
leer_cadena();
cont=0;
 
if (strncmp(lectura, "pinMode", 7)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){ 
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  if (strncmp(bloque, "INPUT", 5)==0) pinMode(par1,INPUT);
  else if (strncmp(bloque, "OUTPUT", 6)==0) pinMode(par1,OUTPUT);
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "digitalWrite", 12)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  if (strncmp(bloque, "HIGH", 4)==0) digitalWrite(par1,HIGH);
  else if (strncmp(bloque, "LOW", 3)==0) digitalWrite(par1,LOW);
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "analogWrite", 11)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  analogWrite(par1,atoi(bloque));
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "digitalRead", 11)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  CDC.printf("%d\n",digitalRead(atoi(bloque)));
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "analogRead", 10)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  CDC.printf("%d\n",analogRead(atoi(bloque)));
  break;
 } 
 cont+=1;
 }
}

else if (strncmp(lectura, "eepromRead", 10)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  CDC.printf("%d\n",EEPROM.read(atoi(bloque)));
  break;
 } 
 cont+=1;
 }
}

else if (strncmp(lectura, "eepromWrite", 11)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  bloque = strtok(bloque,")");
  EEPROM.write(par1, atoi(bloque));
  break;
 } 
 cont+=1;
 }
}

else if (strncmp(lectura, "delay", 5)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  delay(atoi(bloque));
  break;
 } 
 cont+=1;
 }
}
  
else if (strncmp(lectura, "delayMicroseconds", 17)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  delayMicroseconds(atoi(bloque));
  CDC.printf("Done\n");
  break;
 } 
 cont+=1;
 }
}
  
else if (strcmp(lectura, "allOutput")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,LOW);
 }
}

else if (strcmp(lectura, "allInput")==0){
 for (i=0;i<=TotalPines;i++)
  pinMode(i,INPUT);
}

else if (strcmp(lectura, "allHigh")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,HIGH);
 }
}

else if (strcmp(lectura, "allLow")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,LOW);
 }
}
  
else if (strcmp(lectura, "reset")==0)
 reset();
  
}
/*-----------------------------------------------------
Author:  Yeison Cardona --
First release: 05/03/2012
Last release: 11/05/2012
Description: Control de la tarjeta pinguino mediante
comandos transparentes enviados por CDC.
-----------------------------------------------------*/
 
char lectura[21], *bloque;
int par1, valor, cont, i;
 
#include 
#include 
#define TotalPines 21
 
void setup() {
 }

void leer_cadena() {
    unsigned char valor_leido[21];
    unsigned char receivedbyte;
    int cont=1;
    while (cont){    
        receivedbyte=CDC.read(valor_leido);
        valor_leido[receivedbyte]=0;
        if (receivedbyte>0) cont=0;}
    strcpy(lectura,valor_leido);}
  
void loop() {
 
leer_cadena();
cont=0;
 
if (strncmp(lectura, "pinMode", 7)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){ 
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  if (strncmp(bloque, "INPUT", 5)==0) pinMode(par1,INPUT);
  else if (strncmp(bloque, "OUTPUT", 6)==0) pinMode(par1,OUTPUT);
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "digitalWrite", 12)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  if (strncmp(bloque, "HIGH", 4)==0) digitalWrite(par1,HIGH);
  else if (strncmp(bloque, "LOW", 3)==0) digitalWrite(par1,LOW);
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "analogWrite", 11)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ",") ){
 switch (cont){
 case 0: break;
 case 1:
  par1=atoi(bloque);
  break;
 case 2:
  analogWrite(par1,atoi(bloque));
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "digitalRead", 11)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  CDC.printf("%d\n",digitalRead(atoi(bloque)));
  break;
 } 
 cont+=1;
 }
}
 
else if (strncmp(lectura, "analogRead", 10)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  CDC.printf("%d\n",analogRead(atoi(bloque)));
  break;
 } 
 cont+=1;
 }
}

else if (strncmp(lectura, "delay", 5)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  delay(atoi(bloque));
  break;
 } 
 cont+=1;
 }
}
  
else if (strncmp(lectura, "delayMicroseconds", 17)==0){
 for (bloque = strtok(lectura,"("); bloque != NULL; bloque = strtok(NULL, ")") ){
 switch (cont){
 case 0: break;
 case 1:
  delayMicroseconds(atoi(bloque));
  CDC.printf("Done\n");
  break;
 } 
 cont+=1;
 }
}
  
else if (strcmp(lectura, "allOutput")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,LOW);
 }
}

else if (strcmp(lectura, "allInput")==0){
 for (i=0;i<=TotalPines;i++)
  pinMode(i,INPUT);
}

else if (strcmp(lectura, "allHigh")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,HIGH);
 }
}

else if (strcmp(lectura, "allLow")==0){
 for (i=0;i<=TotalPines;i++){
  pinMode(i,OUTPUT);
  digitalWrite(i,LOW);
 }
}
  
}
Script para Scilab: Simple ejemplo de "blinkLED" usando una interfaz con Scilab. Dependencias: Primero hay que instalar la Toolbox de comunicación serial, ésto se puede hacer desde el mismo entorno de Scilab con el comando:
--> atomsInstall('serial')
Ahora sólo basta con reiniciar el Scilab y listo, sin embargo si se genera un error como el siguiente:
no desesperar, que la solución es muy sencilla, sólo basta con ir a home/usuario/.Scilab/scilab-5.3.3/atoms/serial/0.4-1/ y renombrar el archivo etc/serial.start por etc/Serial.start (notese la mayúscula en Serial) Ahora si, reiniciar y se deberá ver algo parecido a:
lo cual nos informa que ya podemos usar la Serial Toolbox. Script: Este es un ejemplo muy sencillo, un blinkLED, recordar que siempre se debe de cerrar el puerto. Primero debemos conceder los permisos al puerto, para ello ejecutamos desde la terminal:
sudo chmod a+rw /dev/ttyACM1
pinguino=openserial('/dev/ttyACM1')
writeserial(pinguino, "pinMode(0,OUTPUT)")

i=0
while (i<=10)
    writeserial(pinguino, "digitalWrite(0,HIGH)")
    printf("HIGH\n")
    sleep(500)
    writeserial(pinguino, "digitalWrite(0,LOW)")
    printf("LOW\n")
    sleep(500)
    i=i+1
end

closeserial(pinguino)

Desde la línea de comandos:

También podemos trabajar desde la línea de comandos con las mismas instrucciones:


>>Otros Lenguajes de Programación

También podría interesarte:

Comentarios:
Julio De La Cruz dijo:
16 de septiembre de 2012 22:04
Excelente, gracias por el aporte nada que podía solucionar el problema. Tengo instalada la versión anterior de Scilab y no me decía cual era el problema en el toolbox.
Voy a publicar una guía básica de CDC y pinguino, tengo las pruebas con processing, pero aplicaría a scilab.
http://micropinguino.blogspot.com/
Responder a Julio De La Cruz
Respuesta de Yeison Cardona:
16 de septiembre de 2012 22:08
Un saludo, estaré pendiente de la guía, soy lector de tu blog ;)
Responder a Yeison Cardona
Respuesta de Jorge Gómez:
abr. 24, 2013, 9:47 p.m.
Hola Compañeros los felicito, tengo un proyecto similar pero mas ambicioso y quiero ver si pueden o quieren participar, es la interrelación con MyOpenLAB, un clonico de LabVIEW de National Instruments,(la investigación para arduino, ya se hizo) se le miden a adaptarlo a Pinguino?
Responder a Jorge Gómez
Respuesta de Jorge Gómez:
abr. 24, 2013, 9:47 p.m.
Hola Compañeros los felicito, tengo un proyecto similar pero mas ambicioso y quiero ver si pueden o quieren participar, es la interrelación con MyOpenLAB, un clonico de LabVIEW de National Instruments,(la investigación para arduino, ya se hizo) se le miden a adaptarlo a Pinguino?
Responder a Jorge Gómez
Jorge Gómez dijo:
abr. 24, 2013, 9:46 p.m.
Hola Compañeros los felicito, tengo un proyecto similar pero mas ambicioso y quiero ver si pueden o quieren participar, es la interrelación con MyOpenLAB, un clonico de LabVIEW de National Instruments,(la investigación para arduino, ya se hizo) se le miden a adaptarlo a Pinguino?
Responder a Jorge Gómez
Miguel Montiel dijo:
mayo 14, 2013, 2:44 p.m.
Hola jorge He bajado MyOpenLAB, pero tengo unos problemas en GNU Linux, he bajados los fuentes y con jdk 7 no compila, ya que esta marcado como deprecated el paquete com.sun.image, el problema se quita con jdk6, pero al correr el programar obtengo el siguiente mensaje Exception in thread "main" java.lang.NullPointerException at VisualLogic.Tools.listDrivers(Unknown Source) at VisualLogic.FrameMain.(Unknown Source) at VisualLogic.FrameMain.main(Unknown Source) Sin embargo esos fuentes si están en el paquete VisualLogic. Bajando el jar que distribuyen, para correrlo, igual con el jdk 6 y desde consola corre con: ~/Descargas/jdk1.6.0_38/jre/bin/java -Xms64M -Xmx512M -XX:MaxPermSize=512M -XX:+UseConcMarkSweepGC -splash:splash.png -jar c-exp-lab.jar Elements pero tengo dudas, como puedo hacer que me quite el \ de las rutas y defina solo / que son las que se usan en GNU/Linux? Gracias
Responder a Miguel Montiel
zdxsakjdty dijo:
dic. 21, 2013, 7:02 a.m.
atTsVD aiwekuejwsbv, [url=http://girmwrifwvoa.com/]girmwrifwvoa[/url], [link=http://opiripnccznf.com/]opiripnccznf[/link], http://mdhaspvjwysj.com/
Responder a zdxsakjdty
Añadir un nuevo comentario:
Si desean una respuesta para su comentario sólo deben agregarme en G+ y hacer una mención a Yeison Cardona, así les podré responder lo antes posible.