Armando un auto con motores de lectora de CD

Por suerte conseguí unas lectoras de CD/DVD para desarmarlas y reutilizar algunas piezas. En este caso, los motores. [Aquí la explicación sobre cómo desarmar una lectora de CD/DVD]

Tomé los dos motores, les agregué una tapita de botellón de agua, los conecté a una pila grande (1.5 v), y la cosa anduvo. Pero sin la suficiente fuerza como para que el auto se mueva.

Como “tercera rueda” (normalmente se usa la rueda que gira para cualquier lado, llamada normalmente “rueda loca”), en este caso es un desodorante a bolilla (supuestamente vacío, pero la verdad, nunca está vacío un desodorante a bolilla)

Autito simple con dos motores de CD/DVD
Autito simple visto desde otro ángulo

Así que finalmente reemplacé la pila por una batería de 9v, y ahora sí, mi auto anda (aunque “chueco”, por un defecto en una de las “ruedas”)

[Clic en la imagen para ver el video del autito funcionando]

Video del autito funcionando

Arduino IDE no permite elegir el puerto

Ya van varias veces que me encuentro con este problema: al ejecutar el software para programar Arduino, puedo elegir el tipo de placa pero no el puerto serial. O al descargar un programa, me dice “Permission denied on /dev/ttyACM0”
Gracias a mis alumnas <3 aprendí que casi siempre se trataba de un problema de permisos (otras veces hace falta un driver).

Si el problema es de permisos, en Windows hay que ejecutar el software como administrador.

En Linux hay que darle permisos a los puertos.

Primero una aclaración que puede extenderse leyendo este post sobre permisos: el comando ls realiza un listado, y si lo utilizamos con el parámetro -l nos muestra también los permisos.

En este post se puede leer la forma de solucionarlo en Linux:
1) Listar los nombres de puertos que tienen algo conectado, con el parámetro “-l” que muestra los permisos:

ls -l /dev | grep ACM

Si no aparece ningún resultado significa que no hay dispositivos conectados. Si hay algo, aparece algo así:

crw-rw—- 1 root dialout 166, 0 ene 19 23:40 ttyACM0

Como las letras de read y write aparecen sólo al principio, podemos ver que sólo el usuario root (el máximo administrador del sistema) puede acceder al puerto.

Vamos a agregarle permisos a ese puerto, de tal manera que cualquier usuario pueda utilizarlo:

sudo chmod 777 /dev/ttyACM0

Finalmente, este será el resultado al listar nuevamente los puertos con sus permisos:

crwxrwxrwx 1 root dialout 166, 1 ene 19 23:46 ttyACM0

Obtener el motor de una lectora de CD vieja

Hoy desarmé la primera lectora de CD, y estoy feliz con mi nuevo motorcito!!

Seguí las instrucciones de hacedores.com, aunque no sé si sabré utilizar las otras partes. Sólo me interesa el motor, por ahora.

Primero, quitar la tapa metálica:
Desatornillar la tapa
Sacar la placa

Segundo, presionar las solapitas para desprender la placa:

Desprender la placa

Tercero, continuar desarmando hasta sacar el motorcito:

Quitar todas las partes hasta encontrar el motor Motor de la lectora de CD

Le puse un papelito para poder apreciar el movimiento. Luego, conecté un cable a 5v y otro a GND. Enchufé el Arduino a la compu, y… ¡Anduvo!
Motor conectado a Arduino

También anda con una batería (aunque yo apunto a usarlo con Arduino, esta es otra opción)
Motor y batería

Hacer clic en esta imagen para ver el video del motorcito funcionando:

Video en youtube del motor funcionando

Cómo modificar la velocidad? Este será mi próximo desafío.

Programemos un juego con Arduino

Hoy armé este pequeño ejemplo como base para un jueguito.

La idea del juego final es que haya una fila de leds y otra fila de botones. Como si se tratara de uno de esos juegos donde el cocodrilo abre la boca y hay que pegarle, cada vez que se enciende una luz, hay que pulsar el botón que le corresponde.

Aquí el código para un solo led y un solo botón. Hay que modificarlo para agregarle luces y botones:

  int nroalazar = 1000;

  int puntaje;

  int pulsado = 0;

  int antespulsado = 0;

  int var;

  const int boton = 12;

 


void setup() {

  // creamos variables para el juego

  pinMode(13, OUTPUT);

  pinMode(12, INPUT);

  Serial.begin(9600);

}

 


void loop() {

  // generamos un número al azar

  nroalazar = int(random(1000));

  digitalWrite(13, HIGH);

  if (digitalRead(boton) == HIGH) { pulsado = 1; }

  else { pulsado = -1; }

  puntaje = puntaje + pulsado;

  Serial.print("Puntaje? ");

  Serial.println(pulsado);

  Serial.print("Puntaje acumulado: ");

  Serial.println(puntaje);

  delay(nroalazar);

  digitalWrite(13, LOW);

  delay(1000);

}
Para ver el puntaje en la pantalla de la computadora, debemos activar el “Monitor serial”.

Un theremin rústico hecho con Arduino

Si hay un instrumento musical fascinante para mí, es el theremin.

Se trata de un instrumento que se ejecuta sin contacto físico. Aquí puede verse un video de cómo suena:Theremin en youtubeAsí que yo quise realizar una aproximación a la programación de un instrumento sin contacto, utilizando un sensor de distancia (ultrasónico) y un buzzer. Este fue el resultado:

Theremin de tres notas con Arduino

Tenemos el buzzer conectado al pin 9 (y a gnd), y el sensor ultrasónico HC-SR04 conectado así:

  • VCC – a 5v
  • TRIG – al pin 12
  • ECHO – al pin 13
  • GND – a gnd

Y este es el código:

#define PIN_TRIG 12
#define PIN_ECO 13
int buzzer = 9;
int numTones = 10;

int tones[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494};
                //DO, DO#, RE, RE#, MI, FA, FA#, SOL, SOL#, A, A#, B

void setup() {
  Serial.begin (9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECO, INPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {
//Este fragmento de código es para tomar la información del sensor ultrasónico HC-SR04
long duracion, distancia;
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);

duracion=pulseIn(PIN_ECO, HIGH);
distancia=(duracion/2)/29;
//Aquí hacemos que la distancia se muestre en el "Monitor Serial"
Serial.println(distancia);

//En esta parte indicamos qué nota tocar de acuerdo a la distancia
switch (distancia) {
      case 0 ... 10:
        tone(buzzer, tones[1]);
        delay(500);
        break;
      case 11 ... 20:
        tone(buzzer, tones[5]);
        delay(500);
        break;
      case 21 ... 30:
        tone(buzzer, tones[8]);
        delay(500);
        break;
      default: 
        noTone(buzzer);      
        delay(500);
}
}

 

Utilización de un pulsador en Arduino

Para poder utilizar un pulsador con Arduino, empecé leyendo este posteo de luisllamas.es

En él se explica que hay dos maneras de conectar un pulsador:

  • En la primera, cuando el pulsador está libre se lee “high” y cuando está pulsado se lee “low”. Esta forma de conectar es llamada resistencia pull-down
  • En la segunda, cuando el pulsador no está presionado se lee “low”, y al presionarlo se lee “high”. Se llama resistencia pull-up

Como quiero utilizar el pulsador para encender un led, opté por la segunda opción.

pulsadorEntonces,

  • Conecto una pata del pulsador directamente a 5v.
  • La otra pata, va conectada a una resistencia y en la misma serie al pin 8.
  • Por otra parte, la resistencia se conecta a GND.

Y el código es:

int valor = 0;


void setup() {

  Serial.begin(9600);

  pinMode(8, INPUT);

  pinMode(13, OUTPUT);

  }

  

  void loop() {

    valor=digitalRead(8);

    if (valor == HIGH) {

      digitalWrite(13, HIGH);}

    else {

      digitalWrite(13, LOW);

    }

    delay (500);

    }

 

Piano de frutas sólo con Arduino

Siempre se ve el clásico ejemplo del piano de bananas. Cuando decidí probar hacer mi propio piano de frutas, encontré que todos los caminos me conducían a Makey Makey.

Sin embargo, buscando un poco más encontré en este posteo del blog untitled.es, la manera de hacer un piano de frutas sin utilizar Makey Makey.

Pagando con un twitt se pueden descargar el plano y el código para realizar un piano de frutas.

El código descargado comienza con esta hermosa leyenda:

/*
Realizado por http://Untitled.es 
Descubre nuevos tutoriales todas las semanas.

Puedes utilizar este ejemplo para lo que te apetezca: 
- Modificarlo 
- Venderlo 
- Leerlo en forma de cuento antes de dormir

Incluso, si decides añadirlo a tu proyecto, puedes compartir la fuente.
*/

Y después de varios intentos, cambiar esto y aquello, desconectar todo y empezar por una sola fruta, descubrí que mi primer piano de frutas no sonaba porque le había puesto una resistencia demasiado grande.

Finalmente, mi código de dos notas (y un led “testigo” en el pin 13) quedó así:

int nota1 = 261;

int nota2 = 1046; 

int zumbador = 8;

void setup() {

  Serial.begin(9600);

  pinMode(zumbador, OUTPUT);  

}

void loop() {

  Serial.print("Analog 1: ");

  Serial.println(analogRead(0));

  if (analogRead(0)<=1020) {

    digitalWrite(13, HIGH); 

    tone(zumbador, nota1);

    delay(100);

    noTone(zumbador);

    digitalWrite(13, LOW);

    }

  if (analogRead(1)<=1020) {

   tone(zumbador, nota2);

    delay(100);

    noTone(zumbador);

    }

    }

Cómo descargar una página web desde Linux

Como a todos/as quienes trabajamos en informática, me ocurre (ya van varias veces) que nos piden continuidad de un viejo trabajo pero resulta que el último administrador se fue dando un portazo y no hay manera de tener accesos como corresponde…

Entonces, debemos recurrir a nuestros mails, nuestra memoria… y finalmente, a alguna herramienta de descarga de una página web, para poder empezar con esa base.

Gracias a este post de GenBeta donde explican tres maneras de almacenar una página web para ver offline, pude retomar unos viejos interactivos.

Simplemente abriendo una terminal (en Debian) y poniendo:

wget --recursive --level=50 -p --convert-links http://lapaginaquequeresbajar.bla.bla

Esto descargará en forma “recursiva” todo el sitio hasta el nivel 50, convirtiendo los enlaces en locales.

En el mismo post se explica que si se quiere bajar todo el sitio se utiliza “inf” en lugar de un número, y se le agrega que espere 30 segundos entre una descarga y otra, para no sobrecargar el servidor:

--level=inf --wait=30

 

Actualizando mi versión de Linux

Bueno, tenía un Huayra viejito instalado por Euge Núñez hace unos cuatro años, y ya no daba para más.
Así que empecé por comprar una notebook con Windows y tuve que hacer allí la copia de seguridad. Luego, descargar un Debian y crear el pendrive instalable.
Aquí relato mis desventuras…
1) Siempre que intenté crear una red en casa fracasé. Esta vez me lo tomé en serio y seguí estos pasos: Configurar servidor Samba para transferir archivos entre Linux y windows

2) Las carpetas se veían y podía copiar un archivo. De todas formas me tiraba muchos errores de permisos hasta que empecé a editar los permisos de las carpetas en Linux, con el botón derecho, permisos, y le di todos los permisos a todos los usuarios y allí tuve éxito de verdad.

3) Luego busqué instrucciones para instalar linux. Según leí no era bueno actualizar por terminal porque lo que yo quería era cambiar de versión. Así que me descargué un Debian. Primero tuve que averiguar si mi computadora era de 32 o de 64 bits. Para ello utilicé el comando lscpu.

alumno@huayra:~$ lscpu
Architecture: i686
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian

4) No logré entender las instrucciones para  “Network Instal from a Minimal CD” (recomendada cuando uno tiene una buena conexión a Internet y va a realizar la instalación en una sola computadora), así que al final me bajé la versión live de 64 bits y luego de ejecutar Debian desde un pendrive elegí la opción “Instalar”. Todo anduvo de maravillas.

5) No funcionaba el sonido después de la instalación, y después de probar algunas cosas con los drivers, me di cuenta de que tenía desenchufados los parlantes… ja!

Un amigo, cuando le comenté lo del sonido me indicó cómo empezar con el tema. Estos comandos pueden ayudarte a detectar componentes:
lshw (hay que instalarlo)
lspci
lsusb

Estoy re contenta con mi computadora con Debian!

 

Servo motor 9g Tower Pro

El Servo motor Tower Pro 9g, no gira 360 grados. Y como todo servomotor, no se utiliza para hacer girar cosas (ruedas, por ejemplo) sino para que se mueva a un ángulo determinado (como un brazo): 0, 90, 180, etc.

Tower Pro Micro Servo 9g

Este es el esquema de conexiones del Micro servo 9g Tower pro (Atención: si se conecta mal, se quema. Ya se me quemaron 2 dando clases…)

  • cable anaranjado: va a un pin de tipo PWD (los de la tilde de la eñe)
  • cable color marrón: GND (tierra)
  • cable color rojo: +5v

Con este código se lo puede hacer funcionar, conectando el cable naranja en el pin 9:

#include <Servo.h>

Servo servo1;

void setup() {
Serial.begin(9600);
servo1.attach(9);

}

void loop() {
servo1.write(0);
delay(1000);
servo1.write(90);
delay(1000);
servo1.write(180);
delay(1000);
}

Allí se utiliza la librería Servo.h, y se crea una instancia llamada “servo1”. Después se le indica que servo1 está conectado al pin 9. Luego se envía a la posición 0 (mediante la orden “servo1.write(0)“), a la posición 90, y a la posición 180. Entre uno y otro paso espera un segundo, con delay(1000)

Entre los ejemplos que vienen en el Arduino IDE hay uno interesante que muestra cómo mover lentamente el servomotor utilizando un bucle:

/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.

modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0; // variable to store the servo position

void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}

Al ejecutar este código, ocurre lo siguiente: