mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Add Nano-RP2040 examples.
This commit is contained in:
parent
bd245546b7
commit
816f2fe4c0
14
scripts/examples/Arduino/Nano-RP2040/00-Basics/blinky.py
Normal file
14
scripts/examples/Arduino/Nano-RP2040/00-Basics/blinky.py
Normal file
@ -0,0 +1,14 @@
|
||||
# Blinky example
|
||||
|
||||
import time
|
||||
from machine import Pin
|
||||
|
||||
# This is the only LED pin available on the Nano RP2040,
|
||||
# other than the RGB LED connected to Nina WiFi module.
|
||||
led = Pin(6, Pin.OUT)
|
||||
|
||||
while (True):
|
||||
led.on()
|
||||
time.sleep_ms(250)
|
||||
led.off()
|
||||
time.sleep_ms(250)
|
||||
@ -0,0 +1,18 @@
|
||||
# I2C scanner examples
|
||||
#
|
||||
# 7-bit addresses for NANO RP2040 on I2C0 bus:
|
||||
#
|
||||
# ATECC608A 0x60
|
||||
# LSM6DSOX 0x6A
|
||||
|
||||
import time
|
||||
from machine import Pin, I2C
|
||||
|
||||
i2c_list = [None, None]
|
||||
i2c_list[0] = I2C(0, scl=Pin(13), sda=Pin(12), freq=100_000)
|
||||
i2c_list[1] = I2C(1, scl=Pin(7), sda=Pin(6), freq=100_000)
|
||||
|
||||
for bus in range(0, 2):
|
||||
print("\nScanning bus %d..."%(bus))
|
||||
for addr in i2c_list[bus].scan():
|
||||
print("Found device at addres %d:0x%x" %(bus, addr))
|
||||
12
scripts/examples/Arduino/Nano-RP2040/01-Sensors/lsm6dsox.py
Normal file
12
scripts/examples/Arduino/Nano-RP2040/01-Sensors/lsm6dsox.py
Normal file
@ -0,0 +1,12 @@
|
||||
# LSM9DS1 Gyro example.
|
||||
import time
|
||||
from lsm6dsox import LSM6DSOX
|
||||
|
||||
from machine import Pin, I2C
|
||||
lsm = LSM6DSOX(I2C(0, scl=Pin(13), sda=Pin(12)))
|
||||
|
||||
while (True):
|
||||
print('Accelerometer: x:{:>8.3f} y:{:>8.3f} z:{:>8.3f}'.format(*lsm.read_accel()))
|
||||
print('Gyroscope: x:{:>8.3f} y:{:>8.3f} z:{:>8.3f}'.format(*lsm.read_gyro()))
|
||||
print("")
|
||||
time.sleep_ms(100)
|
||||
@ -0,0 +1,59 @@
|
||||
# Bluetooth Blinky Example
|
||||
#
|
||||
# Use nRFConnect app from the App store, connect to the Nano and write 1/0 to control the LED.
|
||||
|
||||
import bluetooth
|
||||
import random
|
||||
import struct
|
||||
import time
|
||||
from ble_advertising import advertising_payload
|
||||
from machine import Pin
|
||||
from micropython import const
|
||||
|
||||
LED_PIN = 6
|
||||
|
||||
_IRQ_CENTRAL_CONNECT = const(1)
|
||||
_IRQ_CENTRAL_DISCONNECT = const(2)
|
||||
_IRQ_GATTS_WRITE = const(3)
|
||||
|
||||
_FLAG_READ = const(0x0002)
|
||||
_FLAG_WRITE = const(0x0008)
|
||||
_FLAG_NOTIFY = const(0x0010)
|
||||
_FLAG_INDICATE = const(0x0020)
|
||||
|
||||
_SERVICE_UUID = bluetooth.UUID(0x1523)
|
||||
_LED_CHAR_UUID = (bluetooth.UUID(0x1525), _FLAG_WRITE)
|
||||
_LED_SERVICE = (_SERVICE_UUID, (_LED_CHAR_UUID,),)
|
||||
|
||||
class BLETemperature:
|
||||
def __init__(self, ble, name="NANO RP2040"):
|
||||
self._ble = ble
|
||||
self._ble.active(True)
|
||||
self._ble.irq(self._irq)
|
||||
((self._handle,),) = self._ble.gatts_register_services((_LED_SERVICE,))
|
||||
self._connections = set()
|
||||
self._payload = advertising_payload(name=name, services=[_SERVICE_UUID])
|
||||
self._advertise()
|
||||
|
||||
def _irq(self, event, data):
|
||||
# Track connections so we can send notifications.
|
||||
if event == _IRQ_CENTRAL_CONNECT:
|
||||
conn_handle, _, _ = data
|
||||
self._connections.add(conn_handle)
|
||||
elif event == _IRQ_CENTRAL_DISCONNECT:
|
||||
conn_handle, _, _ = data
|
||||
self._connections.remove(conn_handle)
|
||||
# Start advertising again to allow a new connection.
|
||||
self._advertise()
|
||||
elif event == _IRQ_GATTS_WRITE:
|
||||
Pin(LED_PIN, Pin.OUT).value(int(self._ble.gatts_read(data[-1])[0]))
|
||||
|
||||
def _advertise(self, interval_us=500000):
|
||||
self._ble.gap_advertise(interval_us, adv_data=self._payload)
|
||||
|
||||
if __name__ == "__main__":
|
||||
ble = bluetooth.BLE()
|
||||
temp = BLETemperature(ble)
|
||||
|
||||
while True:
|
||||
time.sleep_ms(1000)
|
||||
@ -0,0 +1,97 @@
|
||||
# This example demonstrates a simple temperature sensor peripheral.
|
||||
#
|
||||
# The sensor's local value updates every second, and it will notify
|
||||
# any connected central every 10 seconds.
|
||||
|
||||
import bluetooth
|
||||
import random
|
||||
import struct
|
||||
import time
|
||||
from ble_advertising import advertising_payload
|
||||
from machine import Pin
|
||||
from micropython import const
|
||||
|
||||
LED_PIN = 6
|
||||
|
||||
_IRQ_CENTRAL_CONNECT = const(1)
|
||||
_IRQ_CENTRAL_DISCONNECT = const(2)
|
||||
_IRQ_GATTS_INDICATE_DONE = const(20)
|
||||
|
||||
_FLAG_READ = const(0x0002)
|
||||
_FLAG_NOTIFY = const(0x0010)
|
||||
_FLAG_INDICATE = const(0x0020)
|
||||
|
||||
# org.bluetooth.service.environmental_sensing
|
||||
_ENV_SENSE_UUID = bluetooth.UUID(0x181A)
|
||||
# org.bluetooth.characteristic.temperature
|
||||
_TEMP_CHAR = (
|
||||
bluetooth.UUID(0x2A6E),
|
||||
_FLAG_READ | _FLAG_NOTIFY | _FLAG_INDICATE,
|
||||
)
|
||||
_ENV_SENSE_SERVICE = (
|
||||
_ENV_SENSE_UUID,
|
||||
(_TEMP_CHAR,),
|
||||
)
|
||||
|
||||
# org.bluetooth.characteristic.gap.appearance.xml
|
||||
_ADV_APPEARANCE_GENERIC_THERMOMETER = const(768)
|
||||
|
||||
|
||||
class BLETemperature:
|
||||
def __init__(self, ble, name="NANO RP2040"):
|
||||
self._ble = ble
|
||||
self._ble.active(True)
|
||||
self._ble.irq(self._irq)
|
||||
((self._handle,),) = self._ble.gatts_register_services((_ENV_SENSE_SERVICE,))
|
||||
self._connections = set()
|
||||
self._payload = advertising_payload(
|
||||
name=name, services=[_ENV_SENSE_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER
|
||||
)
|
||||
self._advertise()
|
||||
|
||||
def _irq(self, event, data):
|
||||
# Track connections so we can send notifications.
|
||||
if event == _IRQ_CENTRAL_CONNECT:
|
||||
conn_handle, _, _ = data
|
||||
self._connections.add(conn_handle)
|
||||
Pin(LED_PIN, Pin.OUT).high()
|
||||
elif event == _IRQ_CENTRAL_DISCONNECT:
|
||||
conn_handle, _, _ = data
|
||||
self._connections.remove(conn_handle)
|
||||
# Start advertising again to allow a new connection.
|
||||
self._advertise()
|
||||
Pin(LED_PIN, Pin.OUT).low()
|
||||
elif event == _IRQ_GATTS_INDICATE_DONE:
|
||||
conn_handle, value_handle, status = data
|
||||
|
||||
def set_temperature(self, temp_deg_c, notify=False, indicate=False):
|
||||
# Data is sint16 in degrees Celsius with a resolution of 0.01 degrees Celsius.
|
||||
# Write the local value, ready for a central to read.
|
||||
self._ble.gatts_write(self._handle, struct.pack("<h", int(temp_deg_c * 100)))
|
||||
if notify or indicate:
|
||||
for conn_handle in self._connections:
|
||||
if notify:
|
||||
# Notify connected centrals.
|
||||
self._ble.gatts_notify(conn_handle, self._handle)
|
||||
if indicate:
|
||||
# Indicate connected centrals.
|
||||
self._ble.gatts_indicate(conn_handle, self._handle)
|
||||
|
||||
def _advertise(self, interval_us=500000):
|
||||
self._ble.gap_advertise(interval_us, adv_data=self._payload)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ble = bluetooth.BLE()
|
||||
temp = BLETemperature(ble)
|
||||
|
||||
t = 25
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
# Write every second, notify every 10 seconds.
|
||||
i = (i + 1) % 10
|
||||
temp.set_temperature(t, notify=i == 0, indicate=False)
|
||||
# Random walk the temperature.
|
||||
t += random.uniform(-0.5, 0.5)
|
||||
time.sleep_ms(1000)
|
||||
61
scripts/examples/Arduino/Nano-RP2040/03-WiFi/ap_mode.py
Normal file
61
scripts/examples/Arduino/Nano-RP2040/03-WiFi/ap_mode.py
Normal file
@ -0,0 +1,61 @@
|
||||
# WiFi AP Mode Example
|
||||
#
|
||||
# This example shows how to use WiFi in Access Point mode.
|
||||
import network, socket, sys, time, gc
|
||||
|
||||
SSID ='OPENMV_AP' # Network SSID
|
||||
KEY ='1234567890' # Network key (must be 10 chars)
|
||||
HOST = '' # Use first available interface
|
||||
PORT = 8080 # Arbitrary non-privileged port
|
||||
|
||||
# Init wlan module and connect to network
|
||||
wlan = network.WLAN(network.AP_IF)
|
||||
wlan.active(True)
|
||||
wlan.config(essid=SSID, key=KEY, security=wlan.WEP, channel=2)
|
||||
print("AP mode started. SSID: {} IP: {}".format(SSID, wlan.ifconfig()[0]))
|
||||
|
||||
def recvall(sock, n):
|
||||
# Helper function to recv n bytes or return None if EOF is hit
|
||||
data = bytearray()
|
||||
while len(data) < n:
|
||||
packet = sock.recv(n - len(data))
|
||||
if not packet:
|
||||
raise OSError("Timeout")
|
||||
data.extend(packet)
|
||||
return data
|
||||
|
||||
def start_streaming(server):
|
||||
print ('Waiting for connections..')
|
||||
client, addr = server.accept()
|
||||
|
||||
# set client socket timeout to 5s
|
||||
client.settimeout(5.0)
|
||||
print ('Connected to ' + addr[0] + ':' + str(addr[1]))
|
||||
|
||||
# FPS clock
|
||||
clock = time.clock()
|
||||
while (True):
|
||||
try:
|
||||
# Read data from client
|
||||
data = recvall(client, 1024)
|
||||
# Send it back
|
||||
client.send(data)
|
||||
except OSError as e:
|
||||
print("start_streaming(): socket error: ", e)
|
||||
client.close()
|
||||
break
|
||||
|
||||
while (True):
|
||||
try:
|
||||
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
# Bind and listen
|
||||
server.bind([HOST, PORT])
|
||||
server.listen(1)
|
||||
|
||||
# Set server socket to blocking
|
||||
server.setblocking(True)
|
||||
while (True):
|
||||
start_streaming(server)
|
||||
except OSError as e:
|
||||
server.close()
|
||||
print("Server socket error: ", e)
|
||||
38
scripts/examples/Arduino/Nano-RP2040/03-WiFi/http_client.py
Normal file
38
scripts/examples/Arduino/Nano-RP2040/03-WiFi/http_client.py
Normal file
@ -0,0 +1,38 @@
|
||||
# Simple HTTP client example.
|
||||
|
||||
import network, socket
|
||||
|
||||
# AP info
|
||||
SSID='' # Network SSID
|
||||
KEY='' # Network key
|
||||
|
||||
PORT = 80
|
||||
HOST = "www.google.com"
|
||||
|
||||
# Init wlan module and connect to network
|
||||
print("Trying to connect. Note this may take a while...")
|
||||
|
||||
wlan = network.WLAN(network.STA_IF)
|
||||
wlan.active(True)
|
||||
wlan.connect(SSID, KEY)
|
||||
|
||||
# We should have a valid IP now via DHCP
|
||||
print("WiFi Connected ", wlan.ifconfig())
|
||||
|
||||
# Get addr info via DNS
|
||||
addr = socket.getaddrinfo(HOST, PORT)[0][4]
|
||||
print(addr)
|
||||
|
||||
# Create a new socket and connect to addr
|
||||
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
client.connect(addr)
|
||||
|
||||
# Set timeout
|
||||
client.settimeout(3.0)
|
||||
|
||||
# Send HTTP request and recv response
|
||||
client.send("GET / HTTP/1.1\r\nHost: %s\r\n\r\n"%(HOST))
|
||||
print(client.recv(1024))
|
||||
|
||||
# Close socket
|
||||
client.close()
|
||||
37
scripts/examples/Arduino/Nano-RP2040/03-WiFi/ntp.py
Normal file
37
scripts/examples/Arduino/Nano-RP2040/03-WiFi/ntp.py
Normal file
@ -0,0 +1,37 @@
|
||||
# NTP Example
|
||||
#
|
||||
# This example shows how to get the current time using NTP with the WiFi shield.
|
||||
|
||||
import network, usocket, ustruct, utime
|
||||
|
||||
# AP info
|
||||
SSID='' # Network SSID
|
||||
KEY='' # Network key
|
||||
|
||||
TIMESTAMP = 2208988800
|
||||
|
||||
# Init wlan module and connect to network
|
||||
print("Trying to connect... (may take a while)...")
|
||||
|
||||
wlan = network.WLAN()
|
||||
wlan.active(True)
|
||||
wlan.connect(SSID, key=KEY, security=wlan.WPA_PSK)
|
||||
|
||||
# We should have a valid IP now via DHCP
|
||||
print(wlan.ifconfig())
|
||||
|
||||
# Create new socket
|
||||
client = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
|
||||
client.bind(("", 8080))
|
||||
#client.settimeout(3.0)
|
||||
|
||||
# Get addr info via DNS
|
||||
addr = usocket.getaddrinfo("pool.ntp.org", 123)[0][4]
|
||||
|
||||
# Send query
|
||||
client.sendto('\x1b' + 47 * '\0', addr)
|
||||
data, address = client.recvfrom(1024)
|
||||
|
||||
# Print time
|
||||
t = ustruct.unpack(">IIIIIIIIIIII", data)[10] - TIMESTAMP
|
||||
print ("Year:%d Month:%d Day:%d Time: %d:%d:%d" % (utime.localtime(t)[0:6]))
|
||||
16
scripts/examples/Arduino/Nano-RP2040/03-WiFi/scan.py
Normal file
16
scripts/examples/Arduino/Nano-RP2040/03-WiFi/scan.py
Normal file
@ -0,0 +1,16 @@
|
||||
# Scan Example
|
||||
#
|
||||
# This example shows how to scan for WiFi networks.
|
||||
|
||||
import time, network
|
||||
|
||||
wlan = network.WLAN(network.STA_IF)
|
||||
wlan.active(True)
|
||||
|
||||
print("Scanning...")
|
||||
while (True):
|
||||
scan_result = wlan.scan()
|
||||
for ap in scan_result:
|
||||
print("Channel:%d RSSI:%d Auth:%d BSSID:%s SSID:%s"%(ap))
|
||||
print()
|
||||
time.sleep_ms(1000)
|
||||
60
scripts/examples/Arduino/Nano-RP2040/04-Audio/audio_fft.py
Normal file
60
scripts/examples/Arduino/Nano-RP2040/04-Audio/audio_fft.py
Normal file
@ -0,0 +1,60 @@
|
||||
import image, audio, time
|
||||
from ulab import numpy as np
|
||||
from ulab import scipy as sp
|
||||
|
||||
CHANNELS = 1
|
||||
FREQUENCY = 32000
|
||||
N_SAMPLES = 32 if FREQUENCY == 16000 else 64
|
||||
SCALE = 2
|
||||
SIZE = (N_SAMPLES * SCALE) // CHANNELS
|
||||
|
||||
raw_buf = None
|
||||
fb = image.Image(SIZE+(50*SCALE), SIZE, image.RGB565, copy_to_fb=True)
|
||||
audio.init(channels=CHANNELS, frequency=FREQUENCY, gain_db=16)
|
||||
|
||||
def audio_callback(buf):
|
||||
# NOTE: do Not call any function that allocates memory.
|
||||
global raw_buf
|
||||
if (raw_buf == None):
|
||||
raw_buf = buf
|
||||
|
||||
# Start audio streaming
|
||||
audio.start_streaming(audio_callback)
|
||||
|
||||
def draw_fft(img, fft_buf):
|
||||
fft_buf = (fft_buf / max(fft_buf)) * SIZE
|
||||
fft_buf = np.log10(fft_buf + 1) * 20
|
||||
color = (0xFF, 0x0F, 0x00)
|
||||
for i in range(0, len(fft_buf)):
|
||||
img.draw_line(i*SCALE, SIZE, i*SCALE, SIZE-int(fft_buf[i]) * SCALE, color, SCALE)
|
||||
|
||||
def draw_audio_bar(img, level, offset):
|
||||
blk_size = (SIZE//10)
|
||||
color = (0xFF, 0x00, 0xF0)
|
||||
blk_space = (blk_size//4)
|
||||
for i in range(0, int(round(level/10))):
|
||||
fb.draw_rectangle(SIZE+offset, SIZE - ((i+1)*blk_size) + blk_space, 20 * SCALE, blk_size - blk_space, color, 1, True)
|
||||
|
||||
while (True):
|
||||
if (raw_buf != None):
|
||||
pcm_buf = np.frombuffer(raw_buf, dtype=np.int16)
|
||||
raw_buf = None
|
||||
|
||||
if CHANNELS == 1:
|
||||
fft_buf = sp.signal.spectrogram(pcm_buf)
|
||||
l_lvl = int((np.mean(abs(pcm_buf[1::2])) / 32768)*100)
|
||||
else:
|
||||
fft_buf = sp.signal.spectrogram(pcm_buf[0::2])
|
||||
l_lvl = int((np.mean(abs(pcm_buf[1::2])) / 32768)*100)
|
||||
r_lvl = int((np.mean(abs(pcm_buf[0::2])) / 32768)*100)
|
||||
|
||||
fb.clear()
|
||||
draw_fft(fb, fft_buf)
|
||||
draw_audio_bar(fb, l_lvl, 0)
|
||||
draw_audio_bar(fb, l_lvl, 25*SCALE)
|
||||
if CHANNELS == 2:
|
||||
draw_audio_bar(fb, r_lvl, 25 * SCALE)
|
||||
fb.flush()
|
||||
|
||||
# Stop streaming
|
||||
audio.stop_streaming()
|
||||
@ -0,0 +1,30 @@
|
||||
# Thermal Camera Demo
|
||||
#
|
||||
# This example shows how to use common low-res FIR sensors (like MLX or AMG).
|
||||
# NOTE: Only the AMG8833 is currently enabled for NANO RP2040.
|
||||
|
||||
import image, time, fir
|
||||
|
||||
IMAGE_SCALE = 5 # Higher scaling uses more memory.
|
||||
drawing_hint = image.BICUBIC # or image.BILINEAR or 0 (nearest neighbor)
|
||||
|
||||
# Initialize the thermal sensor
|
||||
fir.init() #Auto-detects the connected sensor.
|
||||
w = fir.width() * IMAGE_SCALE
|
||||
h = fir.height() * IMAGE_SCALE
|
||||
|
||||
# FPS clock
|
||||
clock = time.clock()
|
||||
|
||||
while (True):
|
||||
clock.tick()
|
||||
|
||||
try:
|
||||
img = fir.snapshot(x_size=w, y_size=h,
|
||||
color_palette=fir.PALETTE_IRONBOW, hint=drawing_hint,
|
||||
copy_to_fb=True)
|
||||
except OSError:
|
||||
continue
|
||||
|
||||
# Print FPS.
|
||||
print(clock.fps())
|
||||
Loading…
Reference in New Issue
Block a user