Я тоже загорелся идеей сделать радиомаяк и, похоже, первую версию сделал.
Основные компоненты:
- ардуинка нано
- передатчик 433 МГц
- LiPo 240 mah
Сборка несложная, маяк получился весьма компактным.
С платы ардуино варварски вырваны регулятор напряжения, светодиод (power) и кнопка перезагрузки
Функциональность:
1. с определенной периодичностью пикает в эфир тоном 540 Гц;
2. изредка пикает двоичным кодом напряжение своего АКБ;
3. остальное время спит
Испытания на энергопотребление еще не проводил, но за ночь напряжение упало незначительно.
Испытания на местности с пристрастием не проводил.
Предварительные тесты:
- в поле на LPD рацию сигнал уверенно принимается даже в условиях значительных помех;
- чем ближе к маяку, тем сигнал сильнее;
- на маяк можно взять пеленг, закрывая рацию, например, животом.
Буду дальше тестировать в полевых условиях.
После результатов предварительных тестов с этим маяком пока отказался от идеи использовать GPS-маяк.
Эксперименты с другими доступными трансиверами так же пока остановил.
- - - Добавлено - - -
#include <avr/sleep.h>
#include <avr/wdt.h>
const byte LED_PIN = 13;
const byte RF_PIN = 11;
const byte SPLITTER = 100;
const byte DURATION_0 = 400;
const byte DURATION_1 = 200;
const byte DURATION_R = 1000;
#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC
#define adc_enable() (ADCSRA |= (1<<ADEN)) // re-enable ADC
byte beaconMode = 0;
// watchdog interrupt
ISR (WDT_vect)
{
wdt_disable(); // disable watchdog
} // end of WDT_vect
void setup () {
//Serial.begin(9600);
}
void loop ()
{
pinMode (LED_PIN, OUTPUT);
pinMode (RF_PIN, OUTPUT);
if (beaconMode == 0) {
int beaconVoltage = readVcc();
//Serial.println(beaconVoltage);
String beaconData = String(beaconVoltage);
String oneStr = "";
send_ready();
delay(1000);
int d2RF;
for (int i = 0; i < beaconData.length(); i++ ){
d2RF = 0;
oneStr += beaconData.charAt(i);
d2RF = oneStr.toInt();
send_d2RF(d2RF);
delay(1000);
oneStr = "";
beaconMode ++;
}
}
else if (beaconMode > 10)
{
beaconMode = 0;
proc1();
}
else
{
beaconMode ++;
proc1();
}
digitalWrite(LED_PIN, HIGH);
delay(10);
digitalWrite(LED_PIN, LOW);
pinMode (RF_PIN, INPUT);
adc_disable();
// clear various "reset" flags
MCUSR = 0;
// allow changes, disable reset
WDTCSR = bit (WDCE) | bit (WDE);
// set interrupt mode and an interval
WDTCSR = bit (WDIE) | bit (WDP2) | bit (WDP1); // set WDIE, and 1 second delay
wdt_reset(); // pat the dog
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
// turn off brown-out enable in software
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
sleep_cpu ();
// cancel sleep as a precaution
sleep_disable();
} // end of loop
void send_d2RF(int d2RF){
switch (d2RF){
case 0:
proc0();
break;
case 1:
proc1();
break;
case 2:
proc1();
delay(SPLITTER);
proc0();
break;
case 3:
proc1();
delay(SPLITTER);
proc1();
break;
case 4:
proc1();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc0();
break;
case 5:
proc1();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc1();
break;
case 6:
proc1();
delay(SPLITTER);
proc1();
delay(SPLITTER);
proc0();
break;
case 7:
proc1();
delay(SPLITTER);
proc1();
delay(SPLITTER);
proc1();
break;
case 8:
proc1();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc0();
break;
case 9:
proc1();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc0();
delay(SPLITTER);
proc1();
break;
}
}
void proc0(){
tone(RF_PIN, 440);
delay(DURATION_0);
noTone(RF_PIN);
}
void proc1(){
tone(RF_PIN, 540);
delay(DURATION_1);
noTone(RF_PIN);
}
void send_ready(){
tone(RF_PIN, 850);
delay(DURATION_R);
noTone(RF_PIN);
}
int readVcc() {
adc_enable();
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); //Wait for Vref to settle
ADCSRA |= _BV(ADSC); //Start conversion
while (bit_is_set(ADCSRA,ADSC)); //Measuring
uint8_t low = ADCL; //Must read ADCL first - it then locks ADCH
uint8_t high = ADCH; //Unlocks both
long result = (high<<8) | low;
//result = 1126400L / result; // Calculate Vcc (in mV);
//result = 1074835L / result;
result = 1151009L / result;
//Disable ADC
adc_disable();
return (int)result; //Vcc in millivolts
}
- - - Добавлено - - -
код прикладываю, если кому нужно будет повторить
Доработал единственное сохранившееся от титановых комет БРЭО.
Перечень доработок:
- в дополнение к двум тиристорным ключам приделал один транзисторный на 2N7000 под запуск спецэффекта в апогее (например, выброс тормозного парашюта);
- подключен такой же передатчик 433 МГц, как и в маяке;
- код дополнил обработкой нового транзисторного ключа, передачей в эфир радиосигнала (для поиска) с одновременной передачей максимальной высоты и напряжения батареи;
- организован спящий режим (после отработки ССР, совмещен с функцией маяка);
- плата контроллера избавлена от нескольких лишних деталей для оптимизации энергопотребления.
Добавил фичу - при полете в эфир передается тон частотой текущего показания высоты в метрах - можно будет услышать/проконтролировать открытие парашюта.
Получился такой вот монстр:
А какая дальность в поле получается? Как ты проверял - передатчик был на земле?
Тесты проводил на ракетном поле ночью при свете Месяца. Поверхность в том районе более-менее ровная. Передатчик забросил на грунт в хащи. Сигнал перестал различать на фоне шума на высоте 1,5 м от земли и в 200 м от передатчика. Расстояние замерил шагами. Когда рацию поднимал выше, сигнал появлялся. На расстоянии 150 м до передатчика сигнал слышно заметно лучше, чем с 200 м. До 50 м сигнал можно пеленговать, закрывая рацию собой. Вблизи (10 м) для ориентирования помогает откручивание антенны - я так дома нашел передатчик.
Попробую сделать тесты вот с такой антенной!:
200 м с земли - это очень хорошо! Если бы на той ракете, что последний раз искали, был такой передатчик, то её бы сразу нашли.
Интересно, что будет с такой антенной)
Давно нужно было сделать такую штуковину, но не все сразу получается. Антенну затестирую завтра в полевых условиях. В лесу особенного эффекта нет, наоборот, неудобно с ней таскаться и народ шарахается особенно по ночам.
Вітаю з Новим Роком! Сегодня в праздничной обстановке протестировал таки маяк в полевых условиях. Сам маяк был упакован в шумку и в новорічний кулек, который люди тщетно пытались от меня спрятать на поле. Поиск выполнялся на штатную антенну. Логика поиска прежняя - в зоне слабого сигнала на штатную антенну спиной ловим пеленг, идем до самого сильного на слух сигнала, в зоне самого сильного сигнала откручиваем антенну и go to 1 до тех пор, пока не наткнемся носом. Круче всех маяк спрятал ребенок- в хащах и под кочкой, я повозился с поиском полчаса, но нашел. Маяк визуально был виден лишь под определенным углом с определенного направления.
- - - Добавлено - - -
Направленную антенну тоже протестировал для самого сложного упомянутого ранее кейса. Для ближнего поиска она мне не сильно помогла - ловит практически под любым углом. А вот с расстояния, где штатная антенна уже совершенно не ловила сигнал на высоте моего роста (дальность порядка более 250 м), направленная антенна уверенно его принимала. Направление на сигнал (+/- 10 градусов ) удалось взять с расстояния порядка 700 м от маяка. Дальше не тестировал, т.к. был весьма впечатлен достигнутым результатом.
Вообщем, радиопоиск великая и весьма увлекательная вещь. Спасибо Vladp и LEVSHA_ за идею и помощь. Еще нужно будет сделать более компактную направленную антенну для наступного летного сезона.
- - - Добавлено - - -
В догонку - бюджет на запчасти для радиомаяка (без учета стоимости рации, антенны и пр.) порядка 100 грн.
Ого, 700 м - это круто! В принципе на земле больше и не нужно. А пока ракета в воздухе, дальность связи будет намного больше, и в это время можно поймать направление на спускающуюся ракету, даже если её совсем не видно. После приземления идти в этом направлении, пока не поймаешь сигнал с земли.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)