Тоже хорошая идея. Буду пробовать... Надеюсь, что "вибрировать" геркон не будет с частотой 600 Гц...
а чего ему вибрировать если к правильному пину подключить, подключать стандартно как PTT или CW (схема ключика), реле можно и повыше питанием, если есть от чего запитать
А этот код влезает в ATtiny13
Скетч использует 630 байт (61%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 110 байт динамической памяти.
Тоже хорошая идея. Буду пробовать... Надеюсь, что "вибрировать" геркон не будет с частотой 600 Гц...
а чего ему вибрировать если к правильному пину подключить, подключать стандартно как PTT или CW (схема ключика), реле можно и повыше питанием, если есть от чего запитать
Давай самую продвинутую реализовать от DetSimen, он недавно обновил скетч у себя на GIT.
Выход сделан на 13 пин, одновременно моргает светодиод
А этот код влезает в ATtiny13
Скетч использует 630 байт (61%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 110 байт динамической памяти.
001
//
002
// Simple Arduino Morse Beacon
003
// Written by Mark VandeWettering K6HX
004
// Email: <a href="mailto:k6hx@arrl.net">k6hx@arrl.net</a>
005
//
006
// This code is so trivial that I'm releasing it completely without
007
// restrictions. If you find it useful, it would be nice if you dropped
008
// me an email, maybe plugged my blog @ <a data-cke-saved-href="<a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a>" href="<a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a>" rel="nofollow"><a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a></a> or included
009
// a brief acknowledgement in whatever derivative you create, but that's
010
// just a courtesy. Feel free to do whatever.
011
//
012
013
014
struct
t_mtab {
char
c, pat; } ;
015
016
struct
t_mtab morsetab[] = {
017
{
'.'
, 106},
018
{
','
, 115},
019
{
'?'
, 76},
020
{
'/'
, 41},
021
{
'A'
, 6},
022
{
'B'
, 17},
023
{
'C'
, 21},
024
{
'D'
, 9},
025
{
'E'
, 2},
026
{
'F'
, 20},
027
{
'G'
, 11},
028
{
'H'
, 16},
029
{
'I'
, 4},
030
{
'J'
, 30},
031
{
'K'
, 13},
032
{
'L'
, 18},
033
{
'M'
, 7},
034
{
'N'
, 5},
035
{
'O'
, 15},
036
{
'P'
, 22},
037
{
'Q'
, 27},
038
{
'R'
, 10},
039
{
'S'
, 8},
040
{
'T'
, 3},
041
{
'U'
, 12},
042
{
'V'
, 24},
043
{
'W'
, 14},
044
{
'X'
, 25},
045
{
'Y'
, 29},
046
{
'Z'
, 19},
047
{
'1'
, 62},
048
{
'2'
, 60},
049
{
'3'
, 56},
050
{
'4'
, 48},
051
{
'5'
, 32},
052
{
'6'
, 33},
053
{
'7'
, 35},
054
{
'8'
, 39},
055
{
'9'
, 47},
056
{
'0'
, 63}
057
} ;
058
059
#define N_MORSE (sizeof(morsetab)/sizeof(morsetab[0]))
060
061
#define SPEED (12)
062
#define DOTLEN (1200/SPEED)
063
#define DASHLEN (3*(1200/SPEED))
064
065
int
LEDpin = 3 ;
066
067
void
068
dash()
069
{
070
digitalWrite(LEDpin, HIGH) ;
071
delay(DASHLEN);
072
digitalWrite(LEDpin, LOW) ;
073
delay(DOTLEN) ;
074
}
075
076
void
077
dit()
078
{
079
digitalWrite(LEDpin, HIGH) ;
080
delay(DOTLEN);
081
digitalWrite(LEDpin, LOW) ;
082
delay(DOTLEN);
083
}
084
085
void
086
send(
char
c)
087
{
088
int
i ;
089
if
(c ==
' '
) {
090
// Serial.print(c) ;
091
delay(7*DOTLEN) ;
092
return
;
093
}
094
for
(i=0; i<N_MORSE; i++) {
095
if
(morsetab[i].c == c) {
096
unsigned
char
p = morsetab[i].pat ;
097
// Serial.print(morsetab[i].c) ;
098
099
while
(p != 1) {
100
if
(p & 1)
101
dash() ;
102
else
103
dit() ;
104
p = p / 2 ;
105
}
106
delay(2*DOTLEN) ;
107
return
;
108
}
109
}
110
/* if we drop off the end, then we send a space */
111
// Serial.print("?") ;
112
}
113
114
void
115
sendmsg(
char
*str)
116
{
117
while
(*str)
118
send(*str++) ;
119
// Serial.println("");
120
}
121
122
void
setup
() {
123
pinMode(LEDpin, OUTPUT) ;
124
/* Serial.begin(9600) ;
125
Serial.println("Simple Arduino Morse Beacon v0.0") ;
126
Serial.println("Written by Mark VandeWettering <k6hx@arrl.net>") ;
127
Serial.println("Check out my blog @ <a data-cke-saved-href="<a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a>" href="<a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a>" rel="nofollow"><a href="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a></a>") ;
128
Serial.println("") ;
129
*/
130
}
131
132
void
loop
() {
133
sendmsg(
"CQ CQ UA6EM/B LN14AF K"
) ;
134
delay(3000) ;
135
}
Попробовал перевести этот проект маяка излучающего в средневолновом диапазоне на ARDUINO NANO:
Код здесь:
001
/* AM Morse-Code Transmitter - see <a href="http://www.technoblogy.com/show?3QEF" title="http://www.technoblogy.com/show?3QEF" rel="nofollow">http://www.technoblogy.com/show?3QEF</a>
002
003
David Johnson-Davies - <a href="http://www.technoblogy.com" title="www.technoblogy.com" rel="nofollow">www.technoblogy.com</a> - 16th December 2021
004
ATtiny85 @ 8 MHz (internal oscillator; BOD disabled)
005
006
CC BY 4.0
007
Licensed under a Creative Commons Attribution 4.0 International license:
008
<a href="http://creativecommons.org/licenses/by/4.0/" title="http://creativecommons.org/licenses/by/4.0/" rel="nofollow">http://creativecommons.org/licenses/by/4.0/</a>
009
010
HABR
011
<a href="https://habr.com/ru/company/ruvds/blog/598955/" title="https://habr.com/ru/company/ruvds/blog/598955/" rel="nofollow">https://habr.com/ru/company/ruvds/blog/598955/</a>
012
*/
013
// По мотивам под ардуино нано
014
// Constants
015
#include <Arduino.h>
016
#include <RotaryEncoder.h>
017
#define PIN_IN1 2 // скорость больше
018
#define PIN_IN2 3 // скорость меньше
019
RotaryEncoder *encoder = nullptr;
020
021
const
int
Speaker = 11;
// PB0
022
const
int
Antenna = 9;
// PB1
023
const
int
Lamp = 13;
// PB2
024
const
int
Keyer = 3;
// PB3
025
const
int
Auto = 7;
// PB4
026
volatile uint8_t Dot = 15;
// Dot duration in 32ths of a second было 6
027
028
const
char
Message[] PROGMEM =
"The quick /* brown fox jumps over the lazy dog.*/ "
;
029
030
uint8_t Chars[48] = {
031
//A B C D E F
032
0b01100000, 0b10001000, 0b10101000, 0b10010000, 0b01000000, 0b00101000,
033
//G H I J K L
034
0b11010000, 0b00001000, 0b00100000, 0b01111000, 0b10110000, 0b01001000,
035
//M N O P Q R
036
0b11100000, 0b10100000, 0b11110000, 0b01101000, 0b11011000, 0b01010000,
037
//S T U V W X
038
0b00010000, 0b11000000, 0b00110000, 0b00011000, 0b01110000, 0b10011000,
039
//Y Z 0 1 2 3
040
0b10111000, 0b11001000, 0b11111100, 0b01111100, 0b00111100, 0b00011100,
041
//4 5 6 7 8 9
042
0b00001100, 0b00000100, 0b10000100, 0b11000100, 0b11100100, 0b11110100,
043
//+ , - . / ?
044
0b01010110, 0b11001110, 0b10000110, 0b01010110, 0b10010100, 0b00110010,
045
//& ' ( ) ! "
046
0b10101110, 0b01000100, 0b10110100, 0b10110110, 0b10101110, 0b01001010,
047
};
048
049
// ENCODER ********************************************
050
void
checkPosition()
051
{
052
encoder->tick();
// just call tick() to check the state.
053
}
054
055
// Timer **********************************************
056
057
volatile unsigned
int
GlobalTicks = 0;
058
059
// Watchdog interrupt counts ticks (1/32 sec)
060
ISR (WDT_vect) {
061
WDTCSR = WDTCSR | 1 << WDIE;
062
GlobalTicks++;
063
}
064
065
// Read ticks without interrupts
066
unsigned
int
Ticks () {
067
cli(); unsigned
int
t = GlobalTicks; sei();
068
return
t;
069
}
070
071
// Wait for n dot durations
072
void
Wait (uint8_t n) {
073
unsigned
int
start = Ticks();
074
while
(Ticks() - start < Dot * n);
075
}
076
077
// Generate morse **********************************************
078
079
// Interrupt modulates carrier at 644Hz
080
ISR (TIMER2_COMPA_vect) {
081
TCCR1B = TCCR1B ^ 1 << CS10;
082
}
083
084
void
Beep (
bool
on) {
085
if
(on) {
086
digitalWrite(Lamp, HIGH);
// LED on
087
TCCR2B = 0 << WGM22 | 1 << CS22;
// Clock / 64
088
}
else
{
089
digitalWrite(Lamp, LOW);
// LED off
090
TCCR2B = 0 << WGM22 | 0 << CS22;
// Clock off
091
TCCR1B = TCCR1B | 1 << CS10;
// Leave carrier on
092
}
093
}
094
095
void
DotDash (
bool
dash) {
096
Beep(
true
);
097
if
(dash) Wait(3);
else
Wait(1);
098
Beep(
false
);
099
Wait(1);
100
}
101
102
void
Letter (
char
letter) {
103
uint8_t index;
104
letter = letter | 0x20;
// Convert letters to lower case
105
if
(letter ==
' '
) {
106
Wait(4);
107
return
;
108
}
109
else
if
(letter >=
'a'
&& letter <=
'z'
) index = letter -
'a'
;
110
else
if
(letter >=
'0'
&& letter <=
'9'
) index = letter -
'0'
+ 26;
111
else
if
(letter >=
'+'
&& letter <=
'/'
) index = letter -
'+'
+ 36;
112
else
if
(letter ==
'?'
) index = 41;
113
else
if
(letter >=
'&'
&& letter <=
')'
) index = letter -
'&'
+ 42;
114
else
if
(letter >=
'!'
&& letter <=
'"'
) index = letter -
'!'
+ 46;
115
else
return
;
116
uint8_t code = Chars[index];
117
while
(code != 0x80) {
118
DotDash(code & 0x80);
119
code = code << 1;
120
}
121
Wait(2);
122
}
123
124
// Setup **********************************************
125
126
void
setup
() {
127
Serial
.begin(115200);
128
pinMode(Antenna, OUTPUT);
// Antenna
129
pinMode(Speaker, OUTPUT);
// Optional piezo
130
pinMode(Lamp, OUTPUT);
// Optional LED
131
pinMode(Keyer, INPUT_PULLUP);
// Morse keyer
132
pinMode(Auto, INPUT_PULLUP);
// Transmit message
133
134
// Set up Timer/Counter1 to generate 571kHz (571.42856)(PIN D9)
135
// Для тактовой 16 мегагерц
136
TCCR1A = 1 << COM1A0;
// CTC mode to OCR1A
137
TCCR1B = 1 << WGM12 | 1 << CS10;
// Clock/1
138
OCR1A = 13;
//
139
140
// Set up Timer/Counter0 to 644Hz (PIN D11)
141
TCCR2A = 1 << COM2A0 | 1 << WGM21;
// CTC mode
142
TCCR2B = 0 << WGM22 | 1 << CS22;
// Clock / 64
143
OCR2A = 193;
// было 96; // Divide by 97
144
TIMSK2 = 1 << OCIE2A;
// Interrupt enabled
145
146
// Set up Watchdog timer for 64Hz interrupt for ticks timer.
147
uint8_t _SREG_COPY = SREG;
148
noInterrupts();
149
WDTCSR = ((1 << WDCE) | (1 << WDE));
150
WDTCSR = 0x00;
151
WDTCSR = 1 << WDIE;
152
SREG = _SREG_COPY;
153
154
155
// ENCODER ********************************************
156
encoder =
new
RotaryEncoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::TWO03);
157
// register interrupt routine
158
attachInterrupt(digitalPinToInterrupt(PIN_IN1), checkPosition, CHANGE);
159
// attachInterrupt(digitalPinToInterrupt(PIN_IN2), checkPosition, CHANGE);
160
}
161
162
void
loop
() {
163
// ENCODER ********************************************
164
static
int
pos = 17;
165
encoder->tick();
// just call tick() to check the state.
166
167
int
newPos = encoder->getPosition();
168
if
(pos != newPos)
169
{
170
if
(newPos < pos) {
171
pos--;
// = pos--;
172
if
(pos < 4) pos = 4;
173
}
174
if
(newPos > pos) {
175
pos++;
176
if
(pos >34) pos = 34;
177
}
178
encoder->setPosition(pos);
179
Dot = pos/2;
180
Serial
.print(
"Dot = "
);
181
Serial
.println(Dot);
182
}
// if
183
184
// Manual mode
185
if
(digitalRead(Keyer) == 0) Beep(
true
);
186
else
Beep(
false
);
187
// Auto mode
188
if
(digitalRead(Auto) == 0) {
189
int
p = 0;
char
c;
190
do
{
191
c = pgm_read_byte(&Message[p++]);
192
if
(c == 0 || digitalRead(Keyer) == 0)
break
;
193
Letter(c);
194
}
while
(
true
);
195
}
196
}
Чо, восстановим наш отоматисский Морзе-маяк? Я нашёл, кста, где накосорезил, кста, в Tiny85 влезет. Или уже не актуально?
Чо, восстановим наш отоматисский Морзе-маяк? Я нашёл, кста, где накосорезил, кста, в Tiny85 влезет. Или уже не актуально?
давай сделаем...
Строку можно по воздуху получать. Через два JDY-40 с компа на Тиньку