Este curso vamos a empezar de nuevo con los Arduinos Nano. Seguimos usando este modelo pues nos permite poder añadir más componentes en una protoboard para poder construir nuestras aplicaciones. Con un Arduino Uno sería más complicado pues tendríamos que llevar cables desde este arduino a la protoboard y éste no quedaría fijado a la protoboard como sí que ocurre con un Arduino Nano.
Lo primero que vamos a construir va a ser esto:
A partir de aquí vamos a comenzar a hacer programas que utilicen ese Led y el pulsador.
lunes, 11 de diciembre de 2017
miércoles, 18 de octubre de 2017
Arquitectura de ordenadores
En este primer tema estamos viendo la arquitectura VON NEWMANN en la que están basados los ordenadores.
Si quieres probar algún programa en ensamblador para ver cómo funciona ésta arquitectura tienes dos simuladores:
lunes, 29 de mayo de 2017
Arduino. Medida de valores analógicos
Para medir valores analógicos con Arduino se utilizan las entradas analógicas. Esto supone que podemos medir el voltaje en un punto de un circuito para monitorear si este voltaje cambia. Y dependiendo de este cambio podremos decidir que acción ejecutar con Arduino.
En nuestro caso vamos a empezar midiendo los valores entregados por un potenciómetro mostrándo el valor leído por el puerto serie del ordenador. Además en nuestro programa vamos a añadir una condición para que compare si el valor leído es superior a un voltaje determinado, para que realice una determinada acción. Por ejemplo emitir un sonido con el altavoz.
//Medida de valores analógicos
int pin_altavoz = 11;
int dato;
float voltajef;
void setup() {
pinMode(pin_altavoz, OUTPUT);
Serial.begin(9600);
Serial.println("Medida de voltajes");
pita();
}
void loop()
{
dato = analogRead(0);
voltajef = dato * 0.0048828;
Serial.print("Voltaje: ");
Serial.println(voltajef);
if (voltajef > 3) pita();
delay(1000);
}
void pita()
{
tone(pin_altavoz, 1500, 1000);
}
miércoles, 24 de mayo de 2017
Arduino. Conexión de altavoz y envío de datos por puerto serie
Ahora vamos a utilizar un pequeño altavoz para emitir sonidos con el Arduino que tenemos. Lo hemos conectado al pin D11, manteniendo en el pin D10 conectado el pulsador. Lo que pretendemos es que cada vez que se accione el pulsador, el altavoz emita un tono.
Además, al mismo tiempo que se emite el tono, envía una información por el puerto serie hacia el PC.
Por otro lado, también se ha incluido la posibilidad de controlar la emisión del tono dependiendo de un dato que se envíe al Arduino por el puerto serie. Así, si se envía un '8' nuestro Arduino emitirá el tono.
Para manejar el puerto serie en nuestro programa se necesita que en primer lugar se configure el puerto. En este caso lo configuramos a una velocidad de 9600bps mediante la línea "Serial.begin(9600)".
Para enviar datos hacia el ordenador por el puerto serie se empleará "Serial.print()" y también "Serial.println()". Este último añade un salto de línea.
Para saber si desde el ordenador se ha enviado algo hacia el Arduino, se comprueba si hay algo en el puerto con "if (Serial.available() > 0)" para después leer el dato recibido con "dato = Serial.read()"
// Demostración de manejo del altavoz y del puerto serie
int n=0;
int pulsador;
int pin_pulsador =10;
int pin_altavoz = 11;
int dato;
void setup() {
pinMode(10, INPUT);
pinMode(11, OUTPUT);
Serial.begin(9600);
pita();
}
public void loop()
{
if (Serial.available() > 0)
{
dato = Serial.read();
if (dato == '8') pita();
}
pulsador = digitalRead(pin_pulsador);
if (pulsador == 0)
{
n = n+1;
Serial.print("He pitado ");
Serial.print(n);
Serial.println(" veces");
pita();
pulsador = 1;
delay(200);
}
}
void pita()
{
tone(pin_altavoz, 1500, 1000);
}
martes, 21 de marzo de 2017
Raspberry. Programación básica en C++ (I)
Para la programación en C++ con Raspberry debemos empezar por aclarar que el compilador que vamos a utilizar es G++. Este ya se encuentra instalado en la Raspberry por lo que para empezar con nuestro primer programa sólo nos queda escribir el código fuente.
El primer ejemplo que vamos a ver es el clásico en el inicio de todos los cursos de programación, vamos a hacer un programa que se limite a escribir un saludo en consola. Así que esto lo podemos conseguir con este ejemplo:
// Ejemplo 1. Hola mundo
#include <stdio.h>
int main()
{
printf("Hola que tal \n");
return 0;
}
Esto mismo también se puede conseguir empleando otro método:
// Ejemplo 1b. Hola mundo
#include <iostream>
using namespace std;
int main()
{
cout << "hola que tal" << endl;
return 0;
}
Si hemos elegido trabajar con "Geany" en el entorno gráfico. Basta con con hacer click en el botón correspondiente a construir y estar pendiente siempre por si aparece algún mensaje de error.
Con el proceso de "construcción" se consigue el fichero ejecutable mediante los procesos de compilación y enlazado. Sólo falta ejecutar el programa, que desde el entorno gráfico es tan sencillo como hacer click en el botón "ejecutar".
Para construir nuestro programa desde consola debemos escribir la siguiente línea:
$ g++ ejemplo1.cpp -o ejemplo1
Para ejecutar el programa desde consola debemos escribir:
$ ./ejemplo1
El primer ejemplo que vamos a ver es el clásico en el inicio de todos los cursos de programación, vamos a hacer un programa que se limite a escribir un saludo en consola. Así que esto lo podemos conseguir con este ejemplo:
// Ejemplo 1. Hola mundo
#include <stdio.h>
int main()
{
printf("Hola que tal \n");
return 0;
}
Esto mismo también se puede conseguir empleando otro método:
// Ejemplo 1b. Hola mundo
#include <iostream>
using namespace std;
int main()
{
cout << "hola que tal" << endl;
return 0;
}
Si hemos elegido trabajar con "Geany" en el entorno gráfico. Basta con con hacer click en el botón correspondiente a construir y estar pendiente siempre por si aparece algún mensaje de error.
Con el proceso de "construcción" se consigue el fichero ejecutable mediante los procesos de compilación y enlazado. Sólo falta ejecutar el programa, que desde el entorno gráfico es tan sencillo como hacer click en el botón "ejecutar".
Para construir nuestro programa desde consola debemos escribir la siguiente línea:
$ g++ ejemplo1.cpp -o ejemplo1
Para ejecutar el programa desde consola debemos escribir:
$ ./ejemplo1
martes, 7 de marzo de 2017
Raspberry. Como usar las entradas y salidas GPIO
Para utilizar la Raspberry como si fuera un Arduino y poder leer datos del exterior o activar leds, relés, etc. Lo primero que necesitamos conocer es la asignación de cada una de las 40 patillas de su conector GPIO. En la siguiente figura se puede ver la disposición de patillas:
(Imagen extraída de https://es.pinout.xyz/#)
Para el manejo de los pines GPIO de la Raspberry vamos a emplear una Librería llamada WiringPi.
Esta librería la podemos descargar directamente desde:
https://git.drogon.net/?p=wiringPi;a=summary
También puedes descargar una copia desde aquí
Una vez descargado, extraes el contenido con el comando:
$tar xfz wiringPi-96344ff.tar.gz
Y después, para instalar (entramos en la carpeta descargada y ejecutamos un archivo de instalación):
$cd wiringPi*
$ ./build
Con esto se consigue compilar e instalar la librería. Ahora podemos realizar una comprobación de que todo funciona ejecutando:
$gpio readall
Todos los pasos realizados se encuentran descritos en:
https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
Ahora podemos escribir directamente en cada uno de los pines de la Raspberry, mediante 2 pasos. Primero se debe configurar el pin a utilizar (como entrada o salida) y a continuación escribir un bit. Como ejemplo vemos a continuación de forma genérica el proceso para escribir un nivel alto en un pin:
$gpio mode [pin] out
$gpio write [pin] 1
No debemos olvidar sustituir "[pin]" por el número del pin (con numeración wiringPi) que queramos usar. Y si queremos escribir un "0", habra que modificar el segundo comando cambiando el "1" por un "0".
Si queremos escribir un "1" en el pin 29, lo hacemos así:
$gpio mode 29 out
$gpio write 29 1
Por otro lado si lo que queremos es leer el estado de un pin, por ejemplo el pin 14 se usará:
$gpio mode 14 in
$gpio read 14
(Imagen extraída de https://es.pinout.xyz/#)
Para el manejo de los pines GPIO de la Raspberry vamos a emplear una Librería llamada WiringPi.
Esta librería la podemos descargar directamente desde:
https://git.drogon.net/?p=wiringPi;a=summary
También puedes descargar una copia desde aquí
Una vez descargado, extraes el contenido con el comando:
$tar xfz wiringPi-96344ff.tar.gz
Y después, para instalar (entramos en la carpeta descargada y ejecutamos un archivo de instalación):
$cd wiringPi*
$ ./build
Con esto se consigue compilar e instalar la librería. Ahora podemos realizar una comprobación de que todo funciona ejecutando:
$gpio readall
Todos los pasos realizados se encuentran descritos en:
https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
Ahora podemos escribir directamente en cada uno de los pines de la Raspberry, mediante 2 pasos. Primero se debe configurar el pin a utilizar (como entrada o salida) y a continuación escribir un bit. Como ejemplo vemos a continuación de forma genérica el proceso para escribir un nivel alto en un pin:
$gpio mode [pin] out
$gpio write [pin] 1
No debemos olvidar sustituir "[pin]" por el número del pin (con numeración wiringPi) que queramos usar. Y si queremos escribir un "0", habra que modificar el segundo comando cambiando el "1" por un "0".
Si queremos escribir un "1" en el pin 29, lo hacemos así:
$gpio mode 29 out
$gpio write 29 1
Por otro lado si lo que queremos es leer el estado de un pin, por ejemplo el pin 14 se usará:
$gpio mode 14 in
$gpio read 14
martes, 28 de febrero de 2017
Arduino. Programar utilizando funciones
// Manejo de display y pulsador, utilizando funciones
int n;
int pulsador;
int pin_pulsador =10;
int pin_punto = 9;
public void setup() {
for (n=0;n<10;n++) pinMode(n, OUTPUT);
pinMode(10, INPUT);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
public void loop()
{
pulsador = digitalRead(pin_pulsador);
if (pulsador == 0)
{
digitalWrite(pin_punto, HIGH);
delay(500);
// 3
tres();
delay(2000);
// 2
dos();
delay(2000);
//1
uno();
delay(2000);
//0
cero();
delay(2000);
}
else digitalWrite(pin_punto, LOW);
}
public void tres()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
public void dos()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
public void uno()
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
public void cero()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
int n;
int pulsador;
int pin_pulsador =10;
int pin_punto = 9;
public void setup() {
for (n=0;n<10;n++) pinMode(n, OUTPUT);
pinMode(10, INPUT);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
public void loop()
{
pulsador = digitalRead(pin_pulsador);
if (pulsador == 0)
{
digitalWrite(pin_punto, HIGH);
delay(500);
// 3
tres();
delay(2000);
// 2
dos();
delay(2000);
//1
uno();
delay(2000);
//0
cero();
delay(2000);
}
else digitalWrite(pin_punto, LOW);
}
public void tres()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
public void dos()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
public void uno()
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
public void cero()
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
jueves, 16 de febrero de 2017
Raspberry. Resumen de comandos de la Terminal
Resumen de comandos para la terminal de Linux utilizados en Raspberry
Comandos de uso general
- apt-get update: Actualiza los repositorios. Es decir la lista de paquetes disponibles para realizar instalaciones de software.
- apt-get upgrade: Actualiza el software que tienes instalado en el sistema.
- apt-get install [nombre
programa]: Instala un programa
- apt-get remove [nombre
programa]: Desinstala programa
- apt-get purge [nombre
programa]: Desinstala programa, borrando ficheros
configuración del mismo (borra completamente)
- adduser [nombre usuario]: Crea un usuario nuevo
- clear: Limpia la ventana del
terminal.
- date: Muestra la fecha actual.
- find [ruta] -name prueba.txt: Busca en el lugar indicado como "ruta" el archivo prueba.txt y genera una lista de todos los
directorios que contienen el archivo. Si en la ruta se indica el directorio raiz "/" buscará en todo el sistema.
- nano [prueba.txt]: Abre el archivo prueba.txt
con “Nano”, uno de los editores de texto de Linux.
- raspi-config: Abre el menú de
configuración.
- poweroff: Apaga el sistema.
- reboot: Reinicia el sistema.
- shutdown -h now: Apaga el sistema.
- shutdown -h 19:00: Programa el apagado del
sistema a las 19:00.
- startx: Abre la interfaz gráfica
Comandos para uso con ficheros y carpetas
- ls : Muestra una lista con los archivos presentes en
el directorio actual. Con el modificador “-l” muestra además otros datos
interesantes como el tamaño del archivo, la fecha de modificación y los
permisos.
- mkdir [carpeta_prueba]: Crea una nueva carpeta
carpeta_prueba dentro de la carpeta actual.
- cp [XXX] [destino]: Copia el archivo o carpeta
XXX y lo pega en una ubicación especificada.
- mv [XXX] [destino]: Mueve el archivo o carpeta
llamado XXX a la localización indicada. Este comando también puede
ser utilizado para renombrar archivos o carpetas, lo único que debemos
tener en cuenta es moverlos en la misma carpeta pero con distinto nombre, por
ejemplo: mv fichero.txt prueba.txt renombraría el
fichero fichero.txt como prueba.txt.
- rm [prueba.txt]: Borra el fichero prueba.txt
- rmdir [prueba]: Borra la carpeta “prueba”. Sólo funciona si la carpeta está vacía.
- cd : Cambia el directorio actual.
- cat [prueba.txt]: Muestra el contenido del
archivo prueba.txt.
Comandos relacionados con redes:
- ifconfig: Sirve para comprobar el estado de la conexión que estamos utilizando, si hay varias tarjetas de red informa del estado de éstas.
- ping: Permite comprobar la conectividad entre dos dispositivos conectados en la misma red.
Comandos de información del sistema:
- cat /proc/meminfo: Informa sobre
nuestro sistema de memoria.
- cat /proc/partitions: Muestra el tamaño y el número
de particiones de la tarjeta SD o del disco duro. Esto mismo se puede hacer con "fdisk -l"
- df : Muestra el espacio disponible
en el disco. Con el modificador "-h" la información es más fácil de interpretar.
- free: Muestra la cantidad de
memoria usada y libre en el sistema.
Suscribirse a:
Entradas (Atom)