Dom. Dez 8th, 2024

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.

Arduino Pro Micro (Imitação chinesa)

Para já utilizo pinos para :

  1. Rotary encoder
  2. Contactos da paddle
  3. Buzzer
Utilizei o belka cad para desenhar o esquema…

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.

  1. Guardar a velocidade utilizada.
  2. Servir de keyer para um radio.
  3. Receber caracteres do Computador.
  4. Suporte para caracteres modificados, por exemplo o ponto de interrogação . . _ _ . . acciona a tecla de ‘_’

By AWB

Deixe um comentário