Armando47/Software: Difference between revisions
(→Modem) |
(→Net) |
||
(18 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
[[Category:Telecom]] | |||
== Modem == | == Modem == | ||
Line 151: | Line 152: | ||
* VHi: Vdd | * VHi: Vdd | ||
== | == CLI == | ||
Una delle due porte seriali viene usata per comunicare con il modem | |||
http://pub.svn.esiliati.org/repos/ciapini/armando/armando.X/interface/cli.h | |||
{| style="color:green; background-color:#ffffcc;" cellpadding="10" cellspacing="0" border="1" | {| style="color:green; background-color:#ffffcc;" cellpadding="10" cellspacing="0" border="1" | ||
! | !Comando | ||
! | !Descrizione | ||
! | !Dati | ||
! | |- | ||
|!||Reset|| | |||
|- | |||
|H||Echo, ripete i dati inseriti sulla CLI||dati da ripetere | |||
|- | |- | ||
| | |V||Torna versione del firmware di Armando|| | ||
|- | |- | ||
| | |T||Inserisce dati in un pacchetto e lo invia nella coda di trasmissione||dati da trasmettere | ||
|- | |- | ||
| | |O||Apre pacchetto||dimensione del pacchetto | ||
|- | |- | ||
| | |A||Aggiunge dati nel pacchetto aperto||dati da aggiungere | ||
|- | |- | ||
| | |C||Chiude pacchetto|| | ||
|- | |- | ||
| | |P||Inserisce comandi per la [[Armando47/ArPhyCLI]]||stringa comandi | ||
|- | |- | ||
| | |N||Inserisce comandi per il [[Armando47/ArNetCLI]]||stringa comandi | ||
|} | |} | ||
== | Esempi: | ||
* W|H|3|tre ripete la stringa "tre" | |||
* W|N|9|S=41,D=56 imposta a 41 l'indirizzo del nodo e a 56 l'indirizzo di destinazione dei pacchetti che verranno accodati | |||
* W|T|7|1234567 crea un pacchetto contenente la stringa "1234567" e lo invia sulla coda di trasmissione | |||
* http://stackoverflow.com/questions/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system | |||
== | == API == | ||
=== Net === | |||
<syntaxhighlight lang="C" line='line'> | |||
uint8_t net_packet_reserve(uint16_t data_size); // controlla se e' possibile accodare un pacchetto | |||
void net_packet_open(void); // intesta un pacchetto | |||
void net_packet_append(uint8_t *data, uint16_t data_size); // appende dati | |||
void net_packet_close(void); // chiude il pacchetto e lo mette in coda | |||
</syntaxhighlight> | |||
==== ArNet ==== | |||
=== Phy === | |||
preamble wait | |||
offset stop | |||
preamble send | |||
send_pdu |
Latest revision as of 11:41, 20 October 2017
Modem
lo strato modem va dalle porte fisiche (ADC e DAC) al flusso di simboli discriminati
ogni simbolo e' definito dalla sua:
- ampiezza
- frequenza
- fase
Limiti:
- la costellazione e' di dimensione massima 16
- il rate massimo e' di 1200 baud
Modulazione
La modulazione e' implementata con un accumulatore di fase
Demodulazione
La demodulazione è implementata con un phase detector ad arcotangente.
letture:
- http://www.w7ay.net/site/Technical/Old/ATC/
- http://www.cse.yorku.ca/course_archive/2010-11/F/3213/CSE3213_07_ShiftKeying_F2010.pdf
PLL
quando si e' riconosciuto il preambolo, un PLL deve sincronizzarsi con la portante del segnale. fatto questo l'oscillatore locale rimane fisso fino alla fine del pacchetto. praticamente lo smorzamento del loop e' basso durante il preambolo e diventa infinitamente alto durante il pacchetto.
letture:
- https://en.wikipedia.org/wiki/Phase-locked_loop#Implementing_a_digital_phase-locked_loop_in_software
- http://lists.canonical.org/pipermail/kragen-hacks/2012-February/000534.html una delle cose piu divertenti che abbia mai provato
- http://arachnoid.com/phase_locked_loop/
Phy
lo strato di PHY va dal discriminatore di simbolo al buffer dei dati
sono supportate 4 modalita' phy:
- raw (il byte in ingresso, troncato ai bit_per_simbolo, viene direttamente encodato in un simbolo)
- ArPhy
- Morse
- #APRS
Net
Protocolli
armando e' in grado di parlare differenti protocolli
APRS
Automatic Packet Reporting System, e' un sistema di localizzazione a pacchetti che usa un protocollo AX.25 in modalita senza connessione su una modulazione afsk Bell 202 a 1200 bps
sarebbero utili 3 modalita APRS
- client, che riceve dalla UART stringhe NMEA e le trasmette in aprs
- digipeater, che ritrasmette i messaggi APRS ricevuti
- gateway, che manda via UART i messaggi APRS ricevuti
Qui c'è vita morte e miracoli dell'aprs, con relative specifiche:
la prima reference: ftp://ftp.tapr.org/aprssig/aprsspec/spec/aprs101/APRS101.pdf
sw da cui è possibile attingere: http://info.aprs.net/index.php?title=Software
Per fortuna ci sono delle bellissime librerie in c++
- http://sourceforge.net/projects/libaprs/
- http://sourceforge.net/projects/ax25/
- https://code.google.com/p/trackuino/ (solo invio) c'e' una versione in gcc-C, progetto vivo
- nei file trackuino-firmware-1.4/trackuino/ax25.cpp e trackuino-firmware-1.4/trackuino/aprs.cpp sembra esserci quel che serve
- https://sites.google.com/site/ki4mcw/Home/arduino-tnc (solo ricezione)
- http://aprsdroid.org/ (invia e riceve, codice utilizzabile?) AGH! e' scritto in SCALA.. mi sa di no
lib NMEA:
ANI
client e server Push-To-Talk ID e selective calling.
tipi di ANI
- Motorola’s MDC-1200
- Kenwood’s FleetSync
- Harris’ G-Star (aka GE-Star)
- DTMF
- 5-Tone
letture:
Morse
GPIO
Armando ha 8 GPIO che possono lavorare nelle seguenti modalita'
R/C
- http://www.aerodesign.de/peter/2000/PCM/PCM_PPM_eng.html
- http://www.pololu.com/blog/17/servo-control-interface-in-detail
CH | porta | descrizione |
---|---|---|
1 | GPIO0 | |
2 | GPIO0 | |
3 | ANALOG0/PWM0 | |
4 | ANALOG1/PWM1 | |
5 | ANALOG2/PWM2 | |
6 | ANALOG3/PWM3 | |
7 | ||
8 |
GPIO0 e GPIO1 sono ingressi logici
ANALOG0 - ANALOG3 sono ingressi analogici (0-vdd)
armando va in trasmissione (setta PTT_OUT alto) quando lo stato degli input cambia.
il protocollo di trasporto e' arNet
in Rx:
dai pin PWM0-3 esce un segnale pwm in standard analog servo r/c. dai pin GPIO0-1 esce un livello logico
- frequenza: 50 Hz
- 0 duty cycle: 1.25 ms
- 512 duty cycle: 1.50 ms
- 1023 duty cycle: 1.75 ms
- VLo: Vss
- VHi: Vdd
CLI
Una delle due porte seriali viene usata per comunicare con il modem
http://pub.svn.esiliati.org/repos/ciapini/armando/armando.X/interface/cli.h
Comando | Descrizione | Dati |
---|---|---|
! | Reset | |
H | Echo, ripete i dati inseriti sulla CLI | dati da ripetere |
V | Torna versione del firmware di Armando | |
T | Inserisce dati in un pacchetto e lo invia nella coda di trasmissione | dati da trasmettere |
O | Apre pacchetto | dimensione del pacchetto |
A | Aggiunge dati nel pacchetto aperto | dati da aggiungere |
C | Chiude pacchetto | |
P | Inserisce comandi per la Armando47/ArPhyCLI | stringa comandi |
N | Inserisce comandi per il Armando47/ArNetCLI | stringa comandi |
Esempi:
- W|H|3|tre ripete la stringa "tre"
- W|N|9|S=41,D=56 imposta a 41 l'indirizzo del nodo e a 56 l'indirizzo di destinazione dei pacchetti che verranno accodati
- W|T|7|1234567 crea un pacchetto contenente la stringa "1234567" e lo invia sulla coda di trasmissione
API
Net
uint8_t net_packet_reserve(uint16_t data_size); // controlla se e' possibile accodare un pacchetto void net_packet_open(void); // intesta un pacchetto void net_packet_append(uint8_t *data, uint16_t data_size); // appende dati void net_packet_close(void); // chiude il pacchetto e lo mette in coda
ArNet
Phy
preamble wait offset stop
preamble send
send_pdu