Para treinar o envio, pensei em arranjar modo de usar o paddle como teclado do PC.
O modo que me pareceu mais simples foi utilizar um arduino micro com USB para fazer de teclado utilizando a lib keyboard.h
Assim encomendei do aliexpress um chinuino ProMicro.
Para já utilizo pinos para :
- Rotary encoder
- Contactos da paddle
- Buzzer
O Botão rotativo serve para ajustar a velocidade, quando pressionado envia Vs.
A Paddle funciona como teclado agora. Podemos ver que ha codigo para mais 2 caracteres inventados ‘_ . . . . _’ dá um espaço e ‘. . _ _’ acciona a tecla de backspace para apagar.
O Código abaixo inclui já algumas coisas para funcionalidades futuras.
////////////////////////////////////////////////////////////////////
//// ////
//// Keyer5 ////
//// ////
///////////////////////////////////////////////////////////////////
#include <Keyboard.h>
#define outputA 6
#define outputB 7
#define encoderSW 5
#define P_DOT 15 //Dit
#define P_DASH 14 // Dah
#define P_AUDIO 8 // Audio out (buzzer)
#define P_CW 4 // key
#define MAX_KEY_SPEED 99
int speed =64;
int counter = 64;
int aState;
int aLastState;
unsigned long t1,t2;
String letra="";
String prevletra;
////////////////////////////////////////////////////////////////////
//// //
//// Letter decoder ////
//// ////
////////////////////////////////////////////////////////////////////
char CWtoLetter(String in){
char l='\\';
if(in=="._"){
l='a';
}else if (in=="_..."){
l='b';
}else if (in=="_._."){
l='c';
}else if (in=="_.."){
l='d';
}else if (in=="."){
l='e';
}else if (in==".._."){
l='f';
}else if (in=="__."){
l='g';
}else if (in=="...."){
l='h';
}else if (in==".."){
l='i';
}else if (in==".___"){
l='j';
}else if (in=="_._"){
l='k';
}else if (in=="._.."){
l='l';
}else if (in=="__"){
l='m';
}else if (in=="_."){
l='n';
}else if (in=="___"){
l='o';
}else if (in==".__."){
l='p';
}else if (in=="__._"){
l='q';
}else if (in=="._."){
l='r';
}else if (in=="..."){
l='s';
}else if (in=="_"){
l='t';
}else if (in==".._"){
l='u';
}else if (in=="..._"){
l='v';
}else if (in==".__"){
l='w';
}else if (in=="_.._"){
l='x';
}else if (in=="_.__"){
l='y';
}else if (in=="__.."){
l='z';
}else if (in==".____"){
l='1';
}else if (in=="..___"){
l='2';
}else if (in=="...__"){
l='3';
}else if (in=="...._"){
l='4';
}else if (in=="....."){
l='5';
}else if (in=="_...."){
l='6';
}else if (in=="__..."){
l='7';
}else if (in=="___.."){
l='8';
}else if (in=="____."){
l='9';
}else if (in=="_____"){
l='0';
}else if (in=="..__.."){
l='?';
}else if (in=="._._._"){
l='.';
}else if (in=="__..__"){
l=',';
}else if (in=="_.._."){
l='/';
}else if (in=="_..._"){
l='\n';
}else if (in=="_...._"){
l=' ';
}else if (in=="..._._"){ //SK
l='+';
}else if (in=="_..._._"){ //BK
l='-';
}else if (in=="..__"){
l='\b';
}
return(l);
}
String LettertoCW(char in){
String l="";
if(in=='a'){
l="._";
}else if (in=='b'){
l="_...";
}else if (in=='c'){
l="_._.";
}else if (in=='d'){
l="_..";
}else if (in=='e'){
l=".";
}else if (in=='f'){
l=".._.";
}else if (in=='g'){
l="__.";
}else if (in=='h'){
l="....";
}else if (in=='i'){
l="..";
}else if (in=='j'){
l=".___";
}else if (in=='k'){
l="_._";
}else if (in=='l'){
l="._..";
}else if (in=='m'){
l="__";
}else if (in=='n'){
l="_.";
}else if (in=='o'){
l="___";
}else if (in=='p'){
l=".__.";
}else if (in=='q'){
l="__._";
}else if (in=='r'){
l="._.";
}else if (in=='s'){
l="...";
}else if (in=='t'){
l="_";
}else if (in=='u'){
l=".._";
}else if (in=='v'){
l="..._";
}else if (in=='w'){
l=".__";
}else if (in=='x'){
l="_.._";
}else if (in=='y'){
l="_.__";
}else if (in=='z'){
l="__..";
}else if (in=='1'){
l=".____";
}else if (in=='2'){
l="..___";
}else if (in=='3'){
l="...__";
}else if (in=='4'){
l="...._";
}else if (in=='5'){
l=".....";
}else if (in=='6'){
l="_....";
}else if (in=='7'){
l="__...";
}else if (in=='8'){
l="___..";
}else if (in=='9'){
l="____.";
}else if (in=='0'){
l="_____";
}else if (in=='?'){
l="..__..";
}else if (in=='.'){
l="._._._";
}else if (in==','){
l="__..__";
}else if (in=='/'){
l="_.._.";
}else if (in=='\n'){
l="_..._";
}else if (in==' '){
l="_...._";
}
return(l);
}
// Initializing the Arduino
void setup()
{
//keyer pinsk
pinMode(P_DOT, INPUT_PULLUP);
pinMode(P_DASH, INPUT_PULLUP);
pinMode(encoderSW, INPUT_PULLUP);
pinMode(P_AUDIO, OUTPUT);
pinMode(P_CW, OUTPUT);
digitalWrite(P_CW, LOW); // Start with key up
//speed encoder
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
speed =40;
sendText("cr7awb");
speed =64;
letra = "";
t1=millis();
}
// Main routine
void loop()
{
//////////////////////////////////////////////////////////////////////////
//// ////
//// Keyer ////
//// ////
//////////////////////////////////////////////////////////////////////////
if(!digitalRead(P_DOT)) // If the dot lever is presssed..
{
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed); // and wait before sending next.
letra=letra+".";
t1=millis();
}
if(!digitalRead(P_DASH)) // If the dash lever is pressed...
{
keyAndBeep(speed*3); // ... send a dash at the given speed
delay(speed); // and wait before sending next
letra=letra+"_";
t1=millis();
}
if(!digitalRead(encoderSW)) // If the button on the encoder was pressed
{
//enviar um V
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed*3);
delay(speed*3);
//enviar um V
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed*3);
delay(speed*3);
//enviar um V
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed); // ... send a dot at the given speed
delay(speed);
keyAndBeep(speed*3);
delay(speed*3);
letra="";
}
//espaço de pouco mais de um dash... nova letra
if ((millis()-t1)>speed*2){
if (letra!=""){
if (CWtoLetter(letra)!='\\'){
Keyboard.press(CWtoLetter(letra));
Keyboard.releaseAll();
}else{
Keyboard.releaseAll();
}
prevletra=letra;
letra="";
}
}
//////////////////////////////////////////////////////////////////////////
//// ////
//// Encoder ////
//// ////
//////////////////////////////////////////////////////////////////////////
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
if (counter>MAX_KEY_SPEED){
counter=MAX_KEY_SPEED;
}
if (counter<1){
counter=1;
}
speed=counter;
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}
//////////////////////////////////////////////////////////////////////////
//// ////
//// Som ////
//// ////
//////////////////////////////////////////////////////////////////////////
void keyAndBeep(int speed)
{
digitalWrite(P_CW, HIGH); // Key down
for (int i=0; i < (speed); i++) // Beep loop
{
digitalWrite(P_AUDIO, HIGH);
delay(1);
}
digitalWrite(P_AUDIO, LOW);
delay(1);
digitalWrite(P_CW, LOW); // Key up
}
void sendText(String Texto){
for(int i =0; i < Texto.length(); i++ ) {
char c = Texto[i];
String cw=LettertoCW(c);
if(cw.length()>0){
for(int j=0; j < cw.length(); j++ ) {
char d = cw[j];
if(d=='.'){
keyAndBeep(speed);
delay(speed);
}else{
keyAndBeep(speed*3);
delay(speed);
}
}
}
delay(speed*3);
}
}
A Fazer.
- Guardar a velocidade utilizada.
- Servir de keyer para um radio.
- Receber caracteres do Computador.
- Suporte para caracteres modificados, por exemplo o ponto de interrogação . . _ _ . . acciona a tecla de ‘_’