Skip to content

Month: February 2009

Morse Code Translator with Arduino

You write in your computer, sends a message thought USB and Arduino translates it into a Morse code.

Just a Arduino board with a buzzer connected at the digital output 12 (one wire in the ground and the other in the 12).

Arduino

I tried to make the code as general as possible so you can easily adapt it for anthers ways of transmitting a Morse code. To do that you just need to rewrite a few functions.

                                                  +-------------------+
                                                  | 3) Interpretation |
                                                  +-------------------+
                                                  |   2) Translation  |
+-------------------+                             +-------------------+
|     Computer      |<========USB (Serial)=======>|     1) Reading    |
+-------------------+                             +-------------------+

  1. Reads a character from Serial. Main function loop().
  2. Translate a ascii char into a Morse code using a reference table. A letter ‘K’ becomes a string word “-.-“. Function say_char().
  3. Interpret the Morse word as light and sound. Mostly at function say_morse_word(). The Interpretation needs 5 functions to say all Morse words, dot(), dash(), shortgap(), mediumgap() and intragap().

For a more details on Morse code I strongly recommend the English Wikipedia article on it.

int led = 13;                   // LED connected to digital pin 13
int buzzer = 12;                // buzzer connected to digital pin 12
int unit = 50;                  // duration of a pulse

char * morsecode[] = {
    "-----",  // 0
    ".----",  // 1
    "..---",  // 2
    "...--",  // 3
    "....-",  // 4
    ".....",  // 5
    "-....",  // 6 
    "--...",  // 7
    "---..",  // 8
    "----.",  // 9
    "---...", // :
    "-.-.-.", // ;
    "",       // < (there's no morse for this simbol)
    "-...-",  // =
    "",       // > (there's no morse for this simbol)
    "..--..", // ?
    ".--._.", // @
    ".-",     // A
    "-...",   // B
    "-.-.",   // C
    "-..",    // D
    ".",      // E
    "..-.",   // F
    "--.",    // G
    "....",   // H
    "..",     // I
    ".---",   // J
    "-.-",    // K
    ".-..",   // L
    "--",     // M
    "-.",     // N
    "---",    // O
    ".--.",   // P
    "--.-",   // Q
    ".-.",    // R
    "...",    // S
    "-",      // T
    "..-",    // U
    "...-",   // V
    ".--",    // W
    "-..-",   // X
    "-.--",   // Y
    "--.."    // Z
};

void setup() {
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);
}

void say_morse_word(char * msg){
  int index = 0;
  while(msg[index]!='\0'){
    // say a dash
    if(msg[index]=='-'){
      dash();
    }
    // say a dot
    if(msg[index]=='.'){
      dot();
    }
    // gap beetween simbols
    intragap();
    index++;
  }
}

// beep
void beep(int time){
  int i;
  int t = 100; // period of the wav. bigger means lower pitch.
  int beepduration = (int)((float)time/t*1800);
  digitalWrite(led, HIGH);
  for(i=0;i='0')&&(letter<='Z')&&(letter!='<')&&(letter!='>')){
    Serial.print(morsecode[letter-'0']);
    Serial.print(' ');
    say_morse_word(morsecode[letter-'0']);
    shortgap();
  } else {
    if(letter==' '){
      Serial.print(" \\ ");
      mediumgap();
    }else{
      Serial.print("X");
    }
  }
}

void loop(){
  if(Serial.available()){
    say_char((char)Serial.read());
  }
}

Additionally you can put another function to say entire strings, like say_string(“HELLO WORLD”)

void say_string(char * asciimsg){
  int index = 0;
  char charac;  
  charac = asciimsg[index];
  while(charac!='\0'){
    say_char(morsecode[charac-'0']);
    Serial.println(morsecode[charac-'0']);
    charac = asciimsg[++index];
    shortgap();
  }
}

You can use the Arduino IDE itself or any other program that talks with the serial port USB.

arduino interface

Arduino on Ubuntu

Arduinos

My Arduinos arrived yesterday. It’s a programmable open source and hardware device.

To install its software on my Ubuntu 8.10 I need Java installed and some tools that I could get by:

sudo apt-get install avrdude avrdude-doc avrp avrprog binutils-avr gcc-avr

SunSPOT Posters

Some fellows asked for some Sun SPOT posters.

Here it is one that you can use to let people know about Project Sun SPOT.

sunspot poster 500px

Download the PNG with 200 dpi resolution or the SVG vetorial drawing. You can use a tool like Inkscape to open and edit the SVG file. You can change colors, images, texts and anything else.

If you need a poster to a presentation about Sun SPOT you can just print or edit this one:

sunspot poster2 500px

Again, download a 200 pdi PNG file or the SVG vetorial drawing.

Good times with Sun SPOT. 😉

JavaFX no Carnaval

Obrigado a todos que compareceram a meu webinar de JavaFX mesmo durante o carnaval. =)

Conforme prometido aqui estão os slides que nós utilizamos:

Download: javafx_carnaval2009.odp

Para assistir o replay da apresentação, clique aqui.

Nos exemplos de código eu procurei seguir a abordagem do Robert Eckstein no videocast Learn JavaFX Script in 15 minutes. O resultado foi muito bom para apresentar a sintáxe da linguagem.

Exemplo 1

def raio = 4;
def Pi = 3.1415;

var area = Pi * (raio * raio);

println("Área do círculo: {area}");

Saída do Exemplo 1:

Área do círculo: 50.264

Exemplo 2

var isActive = true;
var isVisible:Boolean = false;

println("Active: {isActive}");
println("Visible: {isVisible}");

isVisible = true;

println("Visible: {isVisible}");

Saída do Exemplo 2:

Active: true
Visible: false
Visible: true

Exemplo 3

var integer1 = 3;
var number1 = 3.0;

var integer2:Integer = 3;
var number2:Number = 3.0;
var number3:Number = integer1;

println("Integer 1: {integer1}");
println("Integer 2: {integer2}");

println("Number 1: {number1}");
println("Number 2: {number2}");
println("Number 3 (copiado do integer 3): {number3}");

println("Number 1 como Integer: {number1 as Integer}");

Saída do Exemplo 3:

Integer 1: 3
Integer 2: 3
Number 1: 3.0
Number 2: 3.0
Number 3 (copiado do integer 3): 3.0
Number 1 como Integer: 3

Exemplo 4

var s1 = "Olá";
var s2:String = "Olá";

var s3 = "Olá 'mundo'";
var s4 = 'Olá "mundo" ';

println("Primeira String é {s1}");
println("Segunda String é {s2}");
println("Terceira String é {s3}");
println("Quarta String é {s4}");

Saída do Exemplo 4:

Primeira String é Olá
Segunda String é Olá
Terceira String é Olá ‘mundo’
Quarta String é Olá “mundo”

Exemplo 5

var hora = 16;
println("Olá! {if(hora < 12) "Bom dia" else "Boa tarde"}");

def string1 = "Java";
def string2 = "FX";
def javafxstring = "{string1}{string2}";
println(javafxstring);

Saída do Exemplo 5:

Olá! Boa tarde
JavaFX

Exemplo 6

var duration1 = 1s;
var duration2 = 10m;
var duration3:Duration = 5h;
var duration4:Duration = 1ms;

println("Duração 1 é (5 seg): {duration1}");
println("Duração 2 é (10 min): {duration2}");
println("Duração 3 é (5 h): {duration3}");
println("Duração 4 é (1 milisegundo): {duration4}");
println("Duração 1 + Duração 2 (10min e 5 seg): {duration1+duration2}");

Saída do Exemplo 6:

Duração 1 é (5 seg): 1000ms
Duração 2 é (10 min): 600000ms
Duração 3 é (5 h): 18000000ms
Duração 4 é (1 milisegundo): 1ms
Duração 1 + Duração 2 (10min e 5 seg): 601000ms

Exemplo 7

def Pi = 3.1415;
def raio = 5;

println("A área do círculo é {getArea(raio)}");

function getArea(raio: Number): Number {
    var area = Pi * (raio*raio);
    return area;
}

Saída do Exemplo 7:

A área do círculo é 78.53750000000001

Exemplo 8

function checaBalanço(cta:Conta):Void{
    if(cta==null){
        println("Conta nula");
    }else{
        println("Balanço é de {cta.balanço}");
    }
}

class Conta {
    var balanço: Number;
}

var minhaconta = Conta {
    balanço: 9.99
}

checaBalanço(minhaconta);

Saída do Exemplo 8:

Balanço é de 9.99

Exemplo 9

class Monstro {
    var nome: String;
    var nível: Integer;
    var vida: Number;
}

var ogr = Monstro {
    nome: "Ogro"
    nível: 16;
    vida: 100.0;
}

println("nome: {ogr.nome}");
println("nível: {ogr.nível}");
println("vida: {ogr.vida}");

Saída do Exemplo 9:

nome: Ogro
nível: 16
vida: 100.0

Exemplo 10

class Monstro {
    var nome: String;
    var nível: Integer;
    var vida: Number;
    var força: Number;

    function porrada(outro:Monstro){
        outro.vida = outro.vida - força;
    }
}

Exemplo 11

abstract class MonstroVoador {
    var nome: String = "monstro voador";
    abstract function voa():Void;
}

class Griffon extends MonstroVoador{
    override function voa(){
        println("estou voando =D");
    }
}

Exemplo 12

var software: String[] = ["NetBeans", "Java", "JavaFX"];
var hardware: String[] = ["UltraSparc", "Niagra", "SunSpot"];

var oferta = [software,hardware];

println(software);
println(hardware);
println(oferta);

Saída do Exemplo 12:

[ NetBeans, Java, JavaFX ]
[ UltraSparc, Niagra, SunSpot ]
[ NetBeans, Java, JavaFX, UltraSparc, Niagra, SunSpot ]

Exemplo 13

var A = [1..10];
var B = [1,2,3,4,5,6,7,8,9,10];

println("A é igual a B? {A==B}");

var C: Integer[] = [1..11];

println("A é igual a C? {A==C}");

Saída do Exemplo 13:

A é igual a B? true
A é igual a C? false

Exemplo 14

var umadez = [1..10];
var copia = umadez;

println(umadez);
println(copia);

var outracopia = umadez[valor|true];
println(outracopia);

var sopares = umadez[valor|(valor mod 2)==0];
println(sopares);

Saída do Exemplo 14:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 2, 4, 6, 8, 10 ]

Exemplo 15

var sequencia = [1..10];

println("tamanho de sequencia é {sizeof sequencia}");

insert 11 into sequencia;
delete 3 from sequencia;
insert 3 before sequencia[2];
delete sequencia[1];
insert 2 after sequencia[0];
println(sequencia);

delete sequencia;
println(sequencia);

Saída do Exemplo 15:

tamanho de sequencia é 10
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
[ ]

Exemplo 16

var meses = ["jan", "fev", "mar", "abr", "mai", "jun", "jul",
             "ago", "set", "out", "nov", "dez"];

println(sizeof meses);
println(meses[2..5]);
println(meses[2..<5]);
println(meses[2..]);
println(meses[2..<]);

Saída do Exemplo 16:

12
[ mar, abr, mai, jun ]
[ mar, abr, mai ]
[ mar, abr, mai, jun, jul, ago, set, out, nov, dez ]
[ mar, abr, mai, jun, jul, ago, set, out, nov ]

Exemplo 17

var meses = ["jan", "fev", "mar", "abr", "mai", "jun", "jul",
             "ago", "set", "out", "nov", "dez"];

for(mes in meses){
    println(mes);
}

Saída do Exemplo 17:

jan
fev
mar
abr
mai
jun
jul
ago
set
out
nov
dez

Representação e Linguagem em Ferreira Gullar

Ferreira Gullar sentado na escada
Ferreira Gullar

Há um tema que é recorrente quando se estuda por exemplo Inteligência Artificial, Linguagem ou Filosofia, é a Representação das coisas. Há um trecho de um poema do Poema Sujo – um fragmento: “Velocidades” do poeta maranhense Ferreira Gullar que não só exemplifica muito bem as dificuldades de se representar e compreender as coisas e o conhecimento mas também nos mostra que isso é algo que aflinge desde o Poeta até o Computólogo.

O homem está na cidade
como uma coisa está em outra
e a cidade está no homem
que está em outra cidade

mas variados são os modos
como uma coisa
está em outra coisa:
o homem, por exemplo, não está na cidade
como uma árvore está
em qualquer outra
nem como uma árvore
está em qualquer uma de suas folhas
(mesmo rolando longe dela)
O homem não está na cidade
como uma árvore está num livro
quando um vento ali a folheia

a cidade está no homem
mas não da mesma maneira
que um pássaro está numa árvore
não da mesma maneira que um pássaro
(a imagem dele)
está/va na água
e nem da mesma maneira
que o susto do pássaro
está no pássaro que eu escrevo

a cidade está no homem
quase como a árvore voa
no pássaro que a deixa

cada coisa está em outra
de sua própria maneira
e de maneira distinta
de como está em si mesma

a cidade não está no homem
do mesmo modo que em sua
quitandas praças e ruas

Camera nova e fazendo ela trabalhar bem com o Cinelerra

A um tempo atrás eu comprei uma câmera nova pra mim.

Como eu não quero posso comprar uma câmera boa mesmo agora eu preferi comprar uma bem barata que fizesse o básico. Uma câmera de preço médio iria ter poucas funções e eu iria ficar pensando —  se eu tivesse comprado aquela outra. Além disso uma câmera custa um pouco mais trás também um maior zelo e o meu zelo é muito limitado e eu já gasto com outras coisas. Ou seja, cheguei a conclusão que pra mim o ideal seria uma câmera barata que pudesse estar absolutamente sempre comigo, esteja eu a pé, de ônibus ou de carro. Assim eu posso tirar muitas, muitas fotos, já que o meu fim principal pra ela é a documentação de eventos e atividades e não um trabalho artístico.

oregon scientific

Dentro disso e uma certa urgência em voltar a tirar fotos (Campus Party de 2009 chegando) eu comprei nas Americanas (a loja mesmo, não a ponto-com) uma Oregon Scientific (nome estranho) de 5.0 Megapixels com um cartão de 1Gb, por R$ 200.  Ela é bem básica pra fotos já que não tem zoom optico e não se dá bem com movimentos mas a qualidade da gravação dos vídeos, inclusive com aúdio me surpreendeu.

laboratório de metareciclagem
Uma típica foto com ela. Essa em um telecentro da Casa Brasil.

#cparty
Um macro de um robô do ITA durante o Campus Party

Erámos felizes até eu começar a fazer meus primeiros experimentos com os vídeos dela com o Cinelerra (software que eu ainda engatinho).

O vídeo tudo bem mas o aúdio dos vídeos dela (uns arquivos AVI com vídeo codificado e áudio cru) ficavam bichados no Cinelerra mas tocavam bem no Mplayer ou outros tocadores. Como o vídeo estava legal eu só precisava extrair os audios por fora que aí eu podia colocar eles como uma trilha de aúdio do Cinelerra e problema resolvido. O problema é que sempre que eu ia extrair esse aúdio dava algum problema. A solução veio em uma thread da lista de usuários do Mencoder usando a dupla Mplayer e Sox:

mplayer -vc null -vo null -ao pcm video_da_camera.AVI
sox audiodump.wav -i -b -r 48000 -c 2 audio_do_video.wav

No caso eu estou usando a taxa de amostragem em 48kHz e dois canais de áudio (stereo) para ficar compatível com outros formatos que eu estou usando no Cinelerra.

Pronto, voltamos a ser felizes juntos, eu, a câmera e o Cinelerra.

Primeira Reunião FLISOL 2009

Esse sábado aconteceu a primeira reunião de organização do FLISOL (Festival Latino Americano de Instalação de Software Livre) edição Fortaleza de 2009.

A reunião foi no Estúdio de Multimídia do Casa Brasil unidade Vila União e contou com stream de aúdio e vídeo da reunião e chat. ;D Que chique. Aqui está a Ata dessa Reunião. Tiramos por concenso que o local do evento será na unidade Vila União do Casa Brasil no dia 25 de Março. Foram tirados vários GTs (Grupos de Trabalho) para ficarem responsáveis por cada parte do evento. Nós só colocamos nos GT os nomes de quem estava lá, por questão de organização. Mas quem quiser entrar no GT simplesmente coloque seu nome no wiki.