Extraescolar Robòtica 2015-2016

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

Resum sessions

Actuadors. Solenoide, relé, motor DC, motor pas a pas, servomotor. Sensors i actuadors. Domòtica.

Sessions

Teoria

Python i RUR-PLE

Programació de sockets: servidor PHP, client Python

Aquí tenim un exemple de comunicació mitjançant sockets entre un servidor PHP i un client Python. Aquest és un pas previ abans d'abordar el nostre objectiu final, que serà tenir un servidor Arduino i un client Python. server_php.php:

<?php
$server = stream_socket_server("tcp://127.0.0.1:1337", $errno, $errorMessage);

if ($server === false) {
	throw new UnexpectedValueException("Could not bind to socket: $errorMessage ($errno)");
}

$client = @stream_socket_accept($server);
if ($client) {
	echo 'The local time is ' . date('n/j/Y g:i a') . "\n";
	fwrite($client, 'The local time is ' . date('n/j/Y g:i a') . "\n");
	for (;;) {
		$txt_client = fread($client, 1024);
		echo $txt_client."\n";
		fwrite($client, $txt_client);
	}
    	
	fclose($client);
}
?>

client_python.py:

from socket import *
import time

address = ( '127.0.0.1', 1337) #Define who you are talking to (must match arduino IP and port)

client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(address)
  
while(1): #Main Loop
	data = "Blue" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass
		
	time.sleep(2) #delay before sending next command

	data = "Red" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass

	time.sleep(2) #delay before sending next command
    
	data = "Green" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass
		
	time.sleep(2) #delay before sending next command

Per fer funcionar, l'exemple, obrim a Linux dues consoles. Primer llencem el servidor, i en una altra consola llencem el client:

$ php server_php.php
$ python client_python.py

En el servidor tenim un bucle sense fi escoltant les peticions que ens arriben del client. En el client, el primer que es fa és establir una connexió amb el servidor. El client envia informació al servidor i espera a rebre la resposta del servidor. El servidor la única cosa que fa és rebre aquesta informació i rebotar-la un altre cop al client.

Altres enllaços:

Programació de sockets: servidor PHP, dos clients Python en màquines diferents

Fem una petita modificació. Fiquem la IP correcta (treballem amb dues màquines). El servidor PHP espera que els dos clients estiguin connectats:

server_php_v2.php:

<?php
$server = stream_socket_server("tcp://192.168.35.191:1337", $errno, $errorMessage);

if ($server === false) {
	throw new UnexpectedValueException("Could not bind to socket: $errorMessage ($errno)");
}

do{
	$client1 = @stream_socket_accept($server);
	$client2 = @stream_socket_accept($server);
} while (!$client1 || !$client2);



if ($client1 && $client2) {
	echo 'The local time is ' . date('n/j/Y g:i a') . "\n";
	fwrite($client1, 'The local time is ' . date('n/j/Y g:i a') . "\n");
	fwrite($client2, 'The local time is ' . date('n/j/Y g:i a') . "\n");
	for (;;) {
		$txt_client1 = fread($client1, 1024);
		echo $txt_client1."\n";
		fwrite($client1, $txt_client1);

		$txt_client2 = fread($client2, 1024);
		echo $txt_client2."\n";
		fwrite($client2, $txt_client2);
	}
    	
	fclose($client1);
	fclose($client2);
}
?>

client_python.py:

from socket import *
import time

address = ( '192.168.35.191', 1337) #Define who you are talking to (must match arduino IP and port)

client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(address)
  
while(1): #Main Loop
	data = "Blue" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass
		
	time.sleep(2) #delay before sending next command

	data = "Red" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass

	time.sleep(2) #delay before sending next command
    
	data = "Green" #Set data to Blue Command
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass
		
	time.sleep(2) #delay before sending next command

Programació de sockets: servidor Arduino, client Python (ordinador)

A classe tenim un arduino, connectat a la xarxa local mitjançant un Ethernet Shield (l'Arduino té una IP fixa). L'objectiu és que els alumnes, des del seu ordinador i utilitzant Python, es puguin comunicar amb l'Arduino. I això es farà mitjançant la comunicació de sockets. L'arduino ha de ser el servidor, i els diferents ordinadors llençaran scripts Python que són els clients. L'objectiu inicial pot ser que els alumnes encenguin/apaguin el seu LED, o d'un LED comú.

La dinàmica que es vol aconseguir és que els alumnes puguin experimentar amb la limitació de tenir un sol Arduino (la limitació real no és un tema de material, sinó un tema de temps).

L'exemple està basat en:

Primer exemple

arduino_server_v1.ino:

#include <Ethernet.h> //Load Ethernet Library
#include <EthernetUdp.h> //Load UDP Library
#include <SPI.h> //Load the SPI Library

byte mac[] = { 0x9A, 0xA2, 0xDA, 0x00, 0x0A, 0xDC };
IPAddress ip(192, 168, 1, 140); //Assign my IP adress
unsigned int localPort = 5000; //Assign a Port to talk over
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq; //String for our data
int packetSize; //Size of Packet
EthernetUDP Udp; //Define UDP Object

void setup() {
  
Serial.begin(9600); //Turn on Serial Port
Ethernet.begin(mac, ip); //Initialize Ethernet
Udp.begin(localPort); //Initialize Udp
delay(1500); //delay
}

void loop() {
  
  packetSize = Udp.parsePacket(); //Read theh packetSize
  
  if(packetSize>0){ //Check to see if a request is present
  
  Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); //Reading the data request on the Udp
  String datReq(packetBuffer); //Convert packetBuffer array to string datReq
  
  if (datReq =="Red") { //See if Red was requested
  
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
    Udp.print("You are Asking for Red"); //Send string back to client 
    Udp.endPacket(); //Packet has been sent
    Serial.println("Red");
  }
   if (datReq =="Green") { //See if Green was requested
  
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
    Udp.print("You are Asking for Green"); //Send string back to client 
    Udp.endPacket(); //Packet has been sent
    Serial.println("Green"); 
   }
    if (datReq =="Blue") { //See if Red was requested
  
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
    Udp.print("You are Asking for Blue"); //Sed string back to client 
    Udp.endPacket(); //Packet has been sent
    Serial.println("Blue");
    }
  }
  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}

python_client_v1.py:

#http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/
from socket import *
import time

address = ( '192.168.1.140', 5000) #Defind who you are talking to (must match arduino IP and port)
client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socket
client_socket.settimeout(1) #only wait 1 second for a resonse

while(1): #Main Loop

    data = "Blue" #Set data to Blue Command
    client_socket.sendto(data, address) #send command to arduino
    try:
        rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
        print rec_data #Print the response from Arduino
    except:
        pass

    time.sleep(2) #delay before sending next command

    data = "Red" #Set data to Blue Command
    client_socket.sendto(data, address) #send command to arduino
    try:
        rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
        print rec_data #Print the response from Arduino
    except:
        pass

    time.sleep(2) #delay before sending next command
    
    data = "Green" #Set data to Blue Command
    client_socket.sendto(data, address) #send command to arduino
    try:
        rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
        print rec_data #Print the response from Arduino
    except:
        pass
    time.sleep(2) #delay before sending next command

Segon exemple

arduino_server_v2.ino:

/* http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/ */
#include <Ethernet.h> //Load Ethernet Library
#include <EthernetUdp.h> //Load UDP Library
#include <SPI.h> //Load the SPI Library

byte mac[] = { 0x9A, 0xA2, 0xDA, 0x00, 0x0A, 0xDC };
IPAddress ip(192, 168, 1, 140); //Assign my IP adress
unsigned int localPort = 5000; //Assign a Port to talk over
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq; //String for our data
int packetSize; //Size of Packet
EthernetUDP Udp; //Define UDP Object

void setup() {
  
Serial.begin(9600); //Turn on Serial Port
Ethernet.begin(mac, ip); //Initialize Ethernet
Udp.begin(localPort); //Initialize Udp
delay(1500); //delay
}

void loop() {
  
  packetSize = Udp.parsePacket(); //Read theh packetSize
  
  if(packetSize>0){ //Check to see if a request is present
  
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); //Reading the data request on the Udp
    String datReq(packetBuffer); //Convert packetBuffer array to string datReq
    Serial.println(datReq);
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
    Udp.print("El servidor ha repost: " + datReq); //Send string back to client 
    Udp.endPacket(); //Packet has been sent
  }
  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}

python_client_v2.py:

#http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/
from socket import *
import time

address = ( '192.168.1.140', 5000) #Defind who you are talking to (must match arduino IP and port)
client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socket
client_socket.settimeout(1) #only wait 1 second for a response

while(1): #Main Loop

	data = raw_input('Choose a number: ')
	print data
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass

Tercer exemple: encendre i apagar un led

arduino_server_socket_led.ino:

/* http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/ */
#include <Ethernet.h> //Load Ethernet Library
#include <EthernetUdp.h> //Load UDP Library
#include <SPI.h> //Load the SPI Library

byte mac[] = { 0x9A, 0xA2, 0xDA, 0x00, 0x0A, 0xDC };
IPAddress ip(192, 168, 1, 140); //Assign my IP adress
unsigned int localPort = 5000; //Assign a Port to talk over
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq; //String for our data
int packetSize; //Size of Packet
EthernetUDP Udp; //Define UDP Object

void setup() {
  
Serial.begin(9600); //Turn on Serial Port
Ethernet.begin(mac, ip); //Initialize Ethernet
Udp.begin(localPort); //Initialize Udp
delay(1500); //delay

pinMode(8, OUTPUT);
}

void loop() {

  packetSize = Udp.parsePacket(); //Read theh packetSize
  
  if(packetSize>0){ //Check to see if a request is present
  
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); //Reading the data request on the Udp
    String datReq(packetBuffer); //Convert packetBuffer array to string datReq
    Serial.println(datReq);
    
    if (datReq =="1") {
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
      Udp.print("Encenem el led"); //Send string back to client 
      Udp.endPacket(); //Packet has been sent
      digitalWrite(8, HIGH);
     delay(1000);  
    } else if (datReq=="0"){
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
      Udp.print("Apaguem el led"); //Send string back to client 
      Udp.endPacket(); //Packet has been sent
      digitalWrite(8, LOW); 
delay(1000);       
    }
    
  }
  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}

python_client_socket_led.py:

#http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/
from socket import *
import time

address = ( '192.168.1.140', 5000) #Defind who you are talking to (must match arduino IP and port)
client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socket
client_socket.settimeout(1) #only wait 1 second for a response

while(1): #Main Loop

	data = raw_input('1: Encendre el led; 0: Apagar el led ')
	print data
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass

La gràcia d'aquest exercici és que podem tenir molts scripts python interactuant amb el servidor Arduino a través de la xarxa.

TODO: com que hi ha moltes persones que estan interactuant amb el led, podríem llegir quin és l'estat del led (encès o apagat), i fer un toggle: quan està encès, apagar-lo. Quan està apagat, encendre'l.

Quart exemple: Posar un color en un led RGB

arduino_server_socket_led_rgb.ino:

/* http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/ */
#include <Ethernet.h> //Load Ethernet Library
#include <EthernetUdp.h> //Load UDP Library
#include <SPI.h> //Load the SPI Library

byte mac[] = { 0x9A, 0xA2, 0xDA, 0x00, 0x0A, 0xDC };
IPAddress ip(192, 168, 1, 140); //Assign my IP adress
unsigned int localPort = 5000; //Assign a Port to talk over
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq; //String for our data
int packetSize; //Size of Packet
EthernetUDP Udp; //Define UDP Object

/*
 * | | | |
 *   | |
 *     |
 * g r t b
 * /
 */
/*-----Declaracion de variables para cada color R G B-----*/
int rled = 9; // Pin PWN 11 para led rojo
int bled = 10; // Pin PWM 10 para led azul
int gled = 11;  // Pin PWM 9  para led verde
int color;

void setup() {
  
  Serial.begin(9600); //Turn on Serial Port
  Ethernet.begin(mac, ip); //Initialize Ethernet
  Udp.begin(localPort); //Initialize Udp
  delay(1500); //delay

  pinMode(rled, OUTPUT);
  pinMode(bled, OUTPUT);
  pinMode(gled, OUTPUT);
  
  //per comprovar que els colors estan be
  analogWrite(rled,0);
  analogWrite(gled,0);
  analogWrite(bled,0);
  delay(5000);
}

void loop() {

  packetSize = Udp.parsePacket(); //Read theh packetSize
  
  if(packetSize>0){ //Check to see if a request is present
  
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); //Reading the data request on the Udp
    String datReq(packetBuffer); //Convert packetBuffer array to string datReq
    Serial.println(datReq);
    
    if (datReq.substring(0,1) == "R") {
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
      Udp.print("Canvi color"); //Send string back to client
      Udp.endPacket(); //Packet has been sent
      color = datReq.substring(1).toInt();
      Serial.println(color);
      analogWrite(rled,color);
    } else if (datReq.substring(0,1) == "G") {
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
      Udp.print("Canvi color"); //Send string back to client 
      Udp.endPacket(); //Packet has been sent
      color = datReq.substring(1).toInt();
      Serial.println(color);
      analogWrite(gled,color);
    } else if (datReq.substring(0,1) == "B") {
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  //Initialize Packet send
      Udp.print("Canvi color"); //Send string back to client 
      Udp.endPacket(); //Packet has been sent
      color = datReq.substring(1).toInt();
      Serial.println(color);
      analogWrite(bled,color);     
    }
    
  }
  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}

python_client_socket_led.py:

#http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/
from socket import *
import time

address = ( '192.168.1.140', 5000) #Defind who you are talking to (must match arduino IP and port)
client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socket
client_socket.settimeout(1) #only wait 1 second for a response

while(1): #Main Loop

	data = raw_input('Format: [R|G|B]XXX. Per ex: R45, G255, B10\n')
	print data
	client_socket.sendto(data, address) #send command to arduino
	try:
		rec_data, addr = client_socket.recvfrom(2048) #Read response from arduino
		print rec_data #Print the response from Arduino
	except:
		pass

Robot Zowi

Programació amb bitbloq

La instal.lació i configuració del bitbloq s'explica aquí:

Programació amb el Arduino IDE

Ahora selecciona la placa controladora en Herramientas/Tarjeta. En caso de usar la ZUM BT-328 selecciona “Arduino BT w/ATmega328” y en caso de usar una FreaduinoUNO selecciona “Arduino UNO“. - See more at: http://diwo.bq.com/comunicacion-puerto-serie-en-windows-7/#sthash.8rdD1t8V.dpuf

Programació amb Protocoder

Es pot programar amb Protocoder per fer aplicacions per a Android:

Programació amb Protocoder

Introducció

Protocoder és una aplicació web (prototyping framework) per programar dispositius Android (telèfons i tauletes). El nostre objectiu serà programar una aplicació per al mòbil que es comuniqui amb el Zowi a través de bluetooth. Però també podem fer altres coses interessants, com ara llegir en el mòbil la lectura de sensors connectats al arduino Zum.

Com s'explica en aquests dos enllaços, fer l'aplicació Hola món és molt fàcil. El primer que cal fer és instal.lar l'aplicació de Protocoder en el mòbil, que crea una mini-cloud. Programem des de l'ordinador cap al mòbil. Tots dos estan connectats via wifi en la mateixa xarxa local:

En l'ordinador posarem en entorn web la IP del dispositiu mòbil, per ex:

i aleshores accedim via wifi directament al mòbil, on hi ha un sistema de intranet-cloud per gestionar els projectes. Des de l'ordinador, programem, i ho enviem al mòbil directament per provar-ho. És un sistema fàcil de prototipat, i el llenguatge de programació és Javascript.

Ara bé, a mi m'interessa connectar-me a través del cable USB (la segona possibilitat de connexió), doncs a classe amb els alumnes no tindrem accés a la wifi.

Connexió via USB

adb (Android Debug Bridge) ja ho havia fet servir. És la utilitat en mode comanda per comunicar-me amb el dispositiu Android. Per instal.lar-ho a Ubuntu (abril 2016) es pot fer de la següent manera:

$ sudo add-apt-repository ppa:phablet-team/tools
$ sudo apt-get update
$ sudo apt-get install android-tools-adb android-tools-fastboot

Connecto el mòbil via USB i encara no troba el dispositiu:

$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
no n'hi ha

Hem d'habilitar la Depuració USB al mòbil. Això dependrà de la versió del Android, i amb la versió actual que tinc en el mòbil (4.2 o superior) es fa d'aquesta manera:

Per habilitar les opcions de desenvolupador:

  1. Anem a About Phone, i abaix de tot hi ha el Build Number. Hem de clicar 3 o 4 vegades a sobre fins que diu You are now a developer!.
  2. A Settings ens apareix una opció nova, que és Developer Options.
  3. Marquem USB Debugging. Allow USB debugging? Yes

Per les versions d'Android 4.0 o 4.1 era més fàcil: activar depuració USB.

Amb el cable USB connectat, ara ha de trobar el dispositiu:

$ adb devices
List of devices attached
TA929071FQ    device

La connexió entre el Protocoder i el mòbil es farà per tcp, i s'hauran d'obrir els ports. Des de la consola hauré de fer: (sembla ser que això ho he de fer cada vegada)

$ adb forward tcp:8585 tcp:8585
$ adb forward tcp:8587 tcp:8587

En aquest cas el dispositiu mòbil no té una IP, i accedim a l'aplicació mòbil des de l'ordinador amb localhost:

I quan fem Run, s'envia la informació a través del cable USB.

Exemples que he provat

Protocoder i Zowi: fer algo!

Hi ha molt poca documentació. Aquí hi ha codi de Protocoder per al zowi:

En el codi el primer que s'ha de fer és ficar la MAC de bluetooth del zowi. El que també és important fer és que la app del Zowi descarregada del Google Play (la app original) estigui ben tancada, o s'hagi deslligat del Zowi, doncs si no representa que està lligat.

Quan faig Run dóna error perquè no sap què és connectBluetoothSerialByMac:

Cannot find function connectBluetoothSerialByMac in object org.protocoderunner.apprunner.api.PNetwork

Programació amb App Inventor

Placa ZUM i Bluetooth

Bt1.png
Bt2.png

El primer exemple que funciona és el següent:

/***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
const int led_0 = 13;
bqSoftwareSerial bluetooth_0(0, 1, 19200);
String Bt = "";

/***   Setup  ***/
void setup() {
    pinMode(led_0, OUTPUT);
}

/***   Loop  ***/
void loop() {
    Bt = bluetooth_0.readString();
    if (Bt == "1") {
        digitalWrite(led_0, HIGH);
    } else if (Bt == "2") {
        digitalWrite(led_0, LOW);
    }
    delay(2000);
}

La placa ZUM BT-328 porta incorporat un mòdul de Bluetooth (http://diwo.bq.com/zum-bt-328-configuracion-del-bluetooth-mediante-comandos-at/). La manera de què funcioni és:

bqSoftwareSerial bluetooth_0(0, 1, 19200);

és a dir, internament deu estar connectat als pins 0 i 1. Per programar amb BitBloq, s'ha d'agafar un mòdul extern de Bluetooth i connectar el RXD al pin 0; i el TXD al pin 1, a 19200 bauds.

Per establir la comunicació amb el mòbil, hem d'activar el bluetooth al mòbil, fer pairing amb el ZUM (el reconeix com a dispositiu ZUM_BT328, i utilitzo algun Bluetooth terminal que es pot trobar al Play Store. Des del terminal ha d'haver-hi alguna opció de connectar-me al ZUM, i aleshores envio un 1 o un 2 per encendre o apagar el mòbil.

NOTA. Per tal de poder carregar el programa, he de desconnectar l'aplicació del mòbil de la placa.

La comunicació és bidireccional. Puc enviar per bluetooth un missatge des de la placa ZUM fins al terminal:

void loop() {
    Bt = bluetooth_0.readString();
    if (Bt == "1") {
        digitalWrite(led_0, HIGH);
        bluetooth_0.println("ENCÈS");
    } else if (Bt == "2") {
        digitalWrite(led_0, LOW);
        bluetooth_0.println("APAGAT");
    }
}

i rebo la informació d'ENCÈS o APAGAT en el mòbil.

En canvi, les proves que he fet d'utiltizar el port sèrie per enviar informació no funcionen, doncs comparteixen el canal USB.

Un cop funciona la comunicació bluetooth, ara el següent pas seria fer amb App Inventor una aplicació a mida. Per exemple, amb 7 botons per fer les notes de l'escala musical.

Zowi i Bluetooth

El módem de Bluetooth que porta la placa del Zowi és la BC417. El datasheet diu que va a 9600 bps (però es pot configurar a altres bauds enviant comandes AT). El xip està integrat a la placa. En la placa ZUM es veu clarament el mòdul BC417.(https://robotzowi.damia.net/es/), i en el Zowi està totalment integrat.

Per saber com he de programar el Bitbloq, necessito saber quins són els pins Rx i Tx. En el Freeaduino no queda clar, però en el Arduino UNO són els pins 0 o 1. Internament han d'estar connectats (si es fa amb un mòdul extern, tenir en compte que s'han de creuar).

Per programar, vaig al Bitbloq, i exploro per freeaduino + bluetooth o arduino uno + bluetooth, i tinc exemples de com s'ha de gestionar la comunicació. Tanmateix, totes les proves que he fet amb el Zowi no han funcionat.

La idea és que 1. carrego el software al bitbloq; 2. mostro el monitor sèrie on vull veure la informació que arriba; i 3. des del mòbil tinc l'aplicació Bluetooth terminal que em permet connectar-me des del mòbil al Zowi, i enviar comandes. Idealment he de veure allò que envio en el monitor sèrie, però encara no m'ha funcionat.

Solució: Ja tinc un codi que funciona:

/***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
const int brunzidor_0 = 10;
bqSoftwareSerial bluetooth_0(0, 1, 19200);
String BT_Data = "AT";

/***   Setup  ***/
void setup() {
    bluetooth_0.println("Goodnight Moon");
}

/***   Loop  ***/
void loop() {
    BT_Data = bluetooth_0.readString();
    while ((BT_Data.length() > 0)) {
        tone(brunzidor_0, 261, 2000);
        delay(2000);
    }
    delay(2000);
}

Igual que passava amb la placa Zum, el fet de voler utiltizar el monitor sèrie juntament amb el bluetooth fa que no acabi de funcionar. Igual que en la placa Zum, els pins que he de fer servir són el 0 i el 1 (que és on internament ha d'estar connectat el mòdul del bluetooth).

Amb el codi anterior, quan envio una comanda pel bluetooth terminal del mòbil, sona el brunzidor.

Impressora 3D. BQ Prusa i3 Hephestos

Característiques i especificacions

Una impresora 3D te permite explorar los límites de tu imaginación al poder crear todo tipo de figuras y artilugios. La tecnología no para de avanzar y las impresoras 3D son una prueba de ello. Hace unos años era una quimera pero hoy en día es muy fácil y más gracias a la BQ Prusa i3 Hephestos.

El precio de una impresora 3D se ha visto reducido con el paso del tiempo, desembocando en una mayor apertura al público y por lo tanto popularizando las impresoras 3D. La BQ Prusa coge el testigo y continúa con el trabajo de llevarnos a casa la más innovadora tecnología.

La novedad más llamativa de esta impresora 3D son sus cadenetas portacables gracias a las cuales conseguimos recoger los cables en la parte superior, evitando que molesten por todas partes y malogren nuestras creaciones.

También se ha mejorado la seguridad y es que la impresora 3D BQ Prusa i3 Hephestos posee un sistema antiquemaduras caracterizado por un protector al extrusor y sustituyendo la cama caliente por una base fría de cristal que además reduce enormemente su consumo.

Comprar una BQ Prusa i3 Hephestos es comprar una impresora 3D de calidad realizada totalmente con hardware libre y materiales de gran calidad como las barras de cromo o los marcos de aluminio. Podrás modificar tu BQ Prusa y adaptarla a ti cuanto quieras. En BQ Han apostado por eliminar las barreras impuestas al conocimiento y por ello pone a nuestra disposición todas las mejoras realizadas por la compañía y otros usuarios. Podrás descargar todas las piezas nuevas de forma gratuita y crearlas con tu impresora 3D.

La resolución de esta impresora 3D permite ajustarla a distintos niveles de detalle que van desde las 60 a las 300 micras fácilmente configurables a través de la pantalla incluida en la BQ Prusa i3 Hephestos.

Si estás pensando en imprimir una legión de miniaturas o eres un ingeniero en ciernes, no lo duces y compra una BQ Prusa i3 Hephestos, tu impresora 3D al mejor precio aquí, en PcComponentes.

Dimensiones
        Impresora sin bobina PLA: 460 x 370 x 510 mm
        Impresora con bobina PLA: 460 x 370 x 583 mm
        Área de impresión: 215 x 210 x 180 mm
    Resolución
        Muy Alta 60 micras
        Alta 100 micras
        Media 200 micras
        Baja 300 micras
    Velocidad de impresión
        Velocidad recomendada 40-60 mm/sec
        Velocidad máxima recomendada 80-100 mm/sec
    Electrónica
        Ramps 1.4
        Mega 2560
        Pantalla de LCD con encoder rotativo con pulsador para la navegación
        Base fría de cristal tamaño 220 x 220 x 3 mm
        Fuente de alimentación de 220 AC 12 DC 100W
        Termistores 100k en extrusor
        Cartucho calefactor 40W 12V
    Mecánica General
        Marco y base de aluminio pintado al polvo
        Barras de cromo duro para los carros X,Y,Z
        Rodamiento lineal de bolas LM8UU para X, Y, Z
        Rodamiento axial de bolas B623ZZ para las poleas X, Y
        Cadenas portacables Igus
        Acoplamientos flexibles para las varillas roscadas del eje Z
        Sistema de nivelado de base de impresión con 4 puntos y amortiguación
        Sistema de cambio rápido de base de impresión con Clips
        Ventiladores brushless axiales con rodamientos de bolas
        Piezas impresas en PLA
    Mecánica extrusor
        Extrusor de diseño propio
        Boquilla de 0.4 mm para filamento de 1.75 mm
        Disipador de aletas con ventilador axial
        Tobera de refrigeración de pieza
    Materiales PLA, HIPS, FilaFlex entre otros
    Software
        Firmware derivado de Marlin
        Entorno recomendado: Cura Software, Slic3r, Repetier, Kisslicer
        Archivos admitidos: .gcode
        Sistemas operativos compatibles: Windows XP y superiores, Mac OS X y superiores y Linux
    Comunicaciones
        Lector de tarjetas SD
        Puerto USB tipo B
    Seguridad Extrusor protegido con pieza de diseño propio
    Contenido de la caja
        6 guías de montaje
        Certificado de calidad

Garantía: 2 años.

Muntatge

Nivelació de la base i eix Z:

Desmuntar l'extrussor / hotend:

Imprimint. Proves

Ens registrem en el foro de Prusa i3 hephestos:

Perfil impresión Cura FHD (Witbox):

Perfil impresión Cura FHD (Hephestos)

Prueba a laminar con los perfiles de BQ, en función de tu versión de Cura, incluyen muchas más instrucciones en start.gcode y end.gcode, ademas de una configuración correcta.

Profile per a la Prusa i3 hephestos

Descarreguem el perfil per a aquesta impressora (FHD_profile_Cura_PLA_bq_Hephestos.ini). Després d'un temps funcionant, bones opcions són:

Amb aquests paràmetres fruit d'anar fent proves durant 2 mesos tenim el profile que podem considerar definitiu:

Problemes amb el Raft

No em fa el raft. Es pot veure en el GCODE com en la zona del raft (capes -2 i -1, si hem dit que el raft té dues capes), no hi ha cap instrucció. Com que em diu que hi ha una nova versió del Cura, descarrego la versió 15.04.6, fico els paràmetres de la Prusa i3 hephestos, i ara ja tinc el raft. Ho puc veure perquè el temps augmenta una mica, i en el gcode puc veure les instruccions del raft.

Entenent el G-Clode

Software

Instal.lació del paquet Debian: cura_15.04.4-debian_i386.deb

$ sudo dpkg -i cura_15.04.4-debian_i386.deb

Però primer he hagut de resoldre les dependències instal.lant els paquets: (el primer instal.la els altres)

$ cura

3D modeling software

FreeCAD és una bona opció:

Imprimir carcassa Zowi


creat per Joan Quintana Compte, gener 2016

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines