Modifications

Sauter à la navigation Sauter à la recherche
2 305 octets ajoutés ,  26 novembre 2022 à 14:43
Ligne 44 : Ligne 44 :  
|-
 
|-
 
| MOSI
 
| MOSI
| GP7 (Miso)
+
| GP7 (Mosi)
 
|-
 
|-
 
| MISO
 
| MISO
| GP4 (Mosi)
+
| GP4 (Miso)
 
|-
 
|-
 
| SCK
 
| SCK
Ligne 84 : Ligne 84 :  
Finally wire the RFM69HCW radio as follows
 
Finally wire the RFM69HCW radio as follows
   −
[[Fichier:ENG-CANSAT-PICO-RFM69HCW-to-Cansat-Pico-Base.jpg|640px]]
+
[[Fichier:ENG-CANSAT-PICO-RFM69HCW-to-Cansat-Pico-Base-fixed.jpg|640px]]
    
{| class="wikitable"  
 
{| class="wikitable"  
Ligne 103 : Ligne 103 :  
| keep the same pin as receiver.<br />Otherwise use UEXT 10 (=gp10)
 
| keep the same pin as receiver.<br />Otherwise use UEXT 10 (=gp10)
 
|-
 
|-
| MOSI
+
| MISO
 
| 7
 
| 7
 
|  
 
|  
 
| GP4 = MISO
 
| GP4 = MISO
 
|-
 
|-
| MISO
+
| MOSI
 
| 8
 
| 8
 
|  
 
|  
Ligne 132 : Ligne 132 :  
The code is available for download on the [https://github.com/mchobby/cansat-belgium-micropython GitHub associated to this wiki].
 
The code is available for download on the [https://github.com/mchobby/cansat-belgium-micropython GitHub associated to this wiki].
   −
{{download-box|Téléchargez Mission1 Cansat Emitter script (cansat.py)|https://raw.githubusercontent.com/mchobby/cansat-belgium/master/mission1/cansat.py}}
+
{{download-box|Téléchargez Mission1 Cansat Emitter script (cansat.py)|https://github.com/mchobby/cansat-belgium-micropython/blob/main/mission1/cansat.py}}
    
Without any comments, extra lines and print statement (used to debug), the script makes 33 lines long for the full fledged features.
 
Without any comments, extra lines and print statement (used to debug), the script makes 33 lines long for the full fledged features.
Ligne 201 : Ligne 201 :  
[[Fichier:ENG-CANSAT-PICO-MISSION1-CAPTURE-25.png|360px]]
 
[[Fichier:ENG-CANSAT-PICO-MISSION1-CAPTURE-25.png|360px]]
   −
The {{fname|cansat2.py}} script do re-enforce error controls with {{fname|try...except}} statements in the script and showing various onboard LED patterns in case of error.
+
The [https://github.com/mchobby/cansat-belgium-micropython/tree/main/mission1 cansat2.py] script do re-enforce error controls with {{fname|try...except}} statements in the script and showing various onboard LED patterns in case of error.
    
Error Code are reported as quick serie of blink following by slow blink... counting the slow blink gives the error code number.
 
Error Code are reported as quick serie of blink following by slow blink... counting the slow blink gives the error code number.
Ligne 247 : Ligne 247 :  
First, the script will includes all the needed libraries.
 
First, the script will includes all the needed libraries.
   −
<syntaxhighlight lang="python">
+
<syntaxhighlight lang="python">from machine import SPI, I2C, Pin, ADC
from machine import SPI, I2C, Pin, ADC
   
from rfm69 import RFM69
 
from rfm69 import RFM69
 
from bme280 import BME280, BMP280_I2CADDR
 
from bme280 import BME280, BMP280_I2CADDR
Ligne 256 : Ligne 255 :  
This section is immediately followed by the various CONSTANT used in the script.
 
This section is immediately followed by the various CONSTANT used in the script.
   −
<syntaxhighlight lang="python">
+
<syntaxhighlight lang="python">FREQ          = 433.1
FREQ          = 433.1
   
ENCRYPTION_KEY = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
 
ENCRYPTION_KEY = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
 
NODE_ID        = 120 # ID of this node
 
NODE_ID        = 120 # ID of this node
Ligne 265 : Ligne 263 :  
{{dbox-orange|Don't forget to update the radio frequency '''FREQ''' and the '''ENCRYPTION_KEY''' encryption key. }}
 
{{dbox-orange|Don't forget to update the radio frequency '''FREQ''' and the '''ENCRYPTION_KEY''' encryption key. }}
    +
=== Creating ressources ===
 
Then we create the needed buses resources to access the various sensor.
 
Then we create the needed buses resources to access the various sensor.
   −
<syntaxhighlight lang="python">
+
<syntaxhighlight lang="python">spi = SPI(0, baudrate=50000, polarity=0, phase=0, firstbit=SPI.MSB)
spi = SPI(0, baudrate=50000, polarity=0, phase=0, firstbit=SPI.MSB)
   
nss = Pin( 5, Pin.OUT, value=True )
 
nss = Pin( 5, Pin.OUT, value=True )
 
rst = Pin( 3, Pin.OUT, value=False )
 
rst = Pin( 3, Pin.OUT, value=False )
Ligne 276 : Ligne 274 :  
Next we create the RFM69 radio object (named {{fname|rfm}}) and the BMP280 radio object (named {{fname|bmp}}).
 
Next we create the RFM69 radio object (named {{fname|rfm}}) and the BMP280 radio object (named {{fname|bmp}}).
   −
<syntaxhighlight lang="python">
+
<syntaxhighlight lang="python"># RFM Module
# RFM Module
   
rfm = RFM69( spi=spi, nss=nss, reset=rst )
 
rfm = RFM69( spi=spi, nss=nss, reset=rst )
 
rfm.frequency_mhz  = FREQ
 
rfm.frequency_mhz  = FREQ
Ligne 289 : Ligne 286 :  
At the end of initialization section, we do creates the instances for the analog reading (the TMP36, named {{fname|adc}}) and LED controling (named {{fname|led}}).
 
At the end of initialization section, we do creates the instances for the analog reading (the TMP36, named {{fname|adc}}) and LED controling (named {{fname|led}}).
   −
<syntaxhighlight lang="python">  
+
<syntaxhighlight lang="python"># TMP36 analog pin
# TMP36 analog pin
   
adc = ADC(Pin(26))
 
adc = ADC(Pin(26))
 
# Onboard LED
 
# Onboard LED
 
led = Pin(25, Pin.OUT)
 
led = Pin(25, Pin.OUT)
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
=== Information logging ===
    
Just before the main loop, the script print the essential data.
 
Just before the main loop, the script print the essential data.
   −
<syntaxhighlight lang="python">  
+
<syntaxhighlight lang="python"># Main Loop
# Main Loop
   
print( 'Frequency    :', rfm.frequency_mhz )
 
print( 'Frequency    :', rfm.frequency_mhz )
 
print( 'encryption    :', rfm.encryption_key )
 
print( 'encryption    :', rfm.encryption_key )
Ligne 309 : Ligne 306 :  
</syntaxhighlight>
 
</syntaxhighlight>
    +
=== Main Loop execution ===
 
The main loop is composed of an infinite {{fname|while}} loop.
 
The main loop is composed of an infinite {{fname|while}} loop.
   −
<syntaxhighlight lang="python">  
+
<syntaxhighlight lang="python"># Iteration counter
# Iteration counter
   
counter = 1
 
counter = 1
 
# ctime contains the time (in seconds) when the script was stared
 
# ctime contains the time (in seconds) when the script was stared
 
ctime = time.time() # Now
 
ctime = time.time() # Now
 
while True:
 
while True:
     # Main Loop Content
+
     # Main Loop body
 
     ...
 
     ...
 
     ...
 
     ...
Ligne 324 : Ligne 321 :  
     time.sleep(0.4) # wait 0.4 second between iterations
 
     time.sleep(0.4) # wait 0.4 second between iterations
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
The '''Mainloop body''' executes the following steps:
 +
# Reading the sensors data
 +
# Preparing the message
 +
# Sending message
 +
## Switch on the onboard LED
 +
## Log message
 +
## Send message
 +
## Turn of the LED
 +
 +
{{underline|'''Reading sensor data:'''}}
 +
 +
Reading the BMP280 sensor data relies on the {{fname|bme280.py} library previously detailled.
 +
 +
Reading the temperature from TMP36 relies on analog reading and some conversion calculation.
 +
 +
<syntaxhighlight lang="python"># read BMP280
 +
t,hpa,rh =  bmp.raw_values # Temp, press_hPa, humidity
 +
# Read tmp36 (analog)
 +
value = adc.read_u16()
 +
mv = 3300.0 * value / 65535
 +
temp = (mv-500)/10
 +
</syntaxhighlight>
 +
 +
Next the mainloop do prepare the string message (variable {{fname|msg}} by using the powerful Python string formatting feature.
 +
 +
{{underline|'''Formatting data:'''}}
 +
 +
This can be done with one single line. Notice the expression {{fname|time.time()-ctime}} calculating the elapse time (in second) since the mainloop started. 
 +
<syntaxhighlight lang="python"># message: iteration_count,time_sec,pressure_hpa,tmp36_temp,bmp280_temp (coma separated)
 +
msg = ":%i,%i,%6.2f,%5.2f,%5.2f;" % (counter,time.time()-ctime,hpa,temp,t)
 +
</syntaxhighlight>
 +
 +
{{underline|'''Sending data:'''}}
 +
 +
The onboard LED is switched on during data transmission (and print). This makes the LED flashing briefly while data us transmitted.
 +
 +
The data packet are sent without ACK, this would avoids unnecessary latency by waiting for ACK. Indeed, the Cansat will not modifies its behaviours if the data are not received on the ground station.
 +
 +
<syntaxhighlight lang="python">led.on() # Led ON while sending data
 +
print( msg )
 +
# Send a packet without ACK - Send it, don't care if it is received or not
 +
rfm.send(bytes(msg , "utf-8") )
 +
led.off()
 +
</syntaxhighlight>
 +
 +
Just to remind, the {{fname|rfm.send()}} only accepts binary data as generated with bytes() or bytearray(). The message string must be converted to a binary with {{fname|bytes()}}. As binary data does not accept value > 127 without a proper encoding then the bytes() conversion must identifies the encoding of the source string to applies the adequate encoding scheme (UTF8 -> Binary).
    
== Fault tolerant design ==
 
== Fault tolerant design ==
29 917

modifications

Menu de navigation