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).
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.
Reads a character from Serial. Main function loop().
Translate a ascii char into a Morse code using a reference table. A letter ‘K’ becomes a string word “-.-“. Function say_char().
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().
int led =13;// LED connected to digital pin 13int buzzer =12;// buzzer connected to digital pin 12int unit =50;// duration of a pulsechar* 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 dashif(msg[index]=='-'){
dash();}// say a dotif(msg[index]=='.'){
dot();}// gap beetween simbols
intragap();
index++;}}// beepvoid beep(inttime){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<beepduration;i++){
digitalWrite(buzzer, HIGH);
delayMicroseconds(t);
digitalWrite(buzzer, LOW);
delayMicroseconds(t);}
delay(time);}// silencevoid silence(inttime){
digitalWrite(led, LOW);
delay(time);}// general procedure for .void dot(){
beep(unit);}// general procedure for -void dash(){
beep(unit*3);}// gap between dots and dashesvoid intragap(){
silence(unit);}// gap between lettersvoid shortgap(){
silence(3*unit);}// gap be tween wordsvoid mediumgap(){
silence(7*unit);}void say_char(char letter){if((letter>='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());}}
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<beepduration;i++){
digitalWrite(buzzer, HIGH);
delayMicroseconds(t);
digitalWrite(buzzer, LOW);
delayMicroseconds(t);
}
delay(time);
}
// silence
void silence(int time){
digitalWrite(led, LOW);
delay(time);
}
// general procedure for .
void dot() {
beep(unit);
}
// general procedure for -
void dash() {
beep(unit*3);
}
// gap between dots and dashes
void intragap() {
silence(unit);
}
// gap between letters
void shortgap() {
silence(3*unit);
}
// gap be tween words
void mediumgap() {
silence(7*unit);
}
void say_char(char letter){
if((letter>='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”)
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}");
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}");
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}");
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}");
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”
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}");
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;}
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);
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}");
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;}}
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
abstractclass MonstroVoador {
var nome:String="monstro voador";abstract function voa():Void;}class Griffon extends MonstroVoador{
override function voa(){
println("estou voando =D");}}
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);
var software: String[] = ["NetBeans", "Java", "JavaFX"];
var hardware: String[] = ["UltraSparc", "Niagra", "SunSpot"];
var oferta = [software,hardware];
println(software);
println(hardware);
println(oferta);
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}");
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);
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);
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);
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..<]);
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
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.
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.
Uma típica foto com ela. Essa em um telecentro da Casa Brasil.
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:
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.