Scritto da Andrea Martin
il Raspberry Pico è una minucscola scheda che monda un piccolo, ma potente microprocessore dalle seguenti caratteristiche:
La programmazione “naturale” di questo dispositivo è ovviamente in C, ma ne parliamo qui perchè si stà sviluppando un wrapper per poterlo utilizzare anche con Nim. Ovviamente ce ancora molto lavoro da fare, ma con l’ultima versione della libreria “picostdlib” si son fatti molti passi avanti, sopratutto sulla semplicità di avviare, compilare il nostro progetto, e non solo, abbiamo aggiunto funzionalità che potrebbero essere interessanti, qui puoi trovare la libreria:
picostdlib link: https://github.com/beef331/picostdlib
Oltre al controllo dei pin (input, outup, pullup, pulldown) in modalità classica,ultimamnete si son aggiunti due importanti funzioni per un microntrollore:
Al momento ho anche sviluppato una semplice libreria per far leggere al micro, non solo i caratteri singoli inviati via usb, ma di prendere l’intera stringa inviata, cosa molto utile per i protocolli di comunicazione verso lo stesso micro, in più sto scrivendo la libreria per un PCF8574 ovvero un I/O expander, ma sono ancora in sviluppo. Diseguito un breve esempio:
import picostdlib/[gpio, i2c]
import picostdlib
const
on = true
off = false
p0: uint8 = 0b00000001
p1: uint8 = 0b00000010
p2: uint8 = 0b00000100
p3: uint8 = 0b00001000
p4: uint8 = 0b00010000
p5: uint8 = 0b00100000
p6: uint8 = 0b01000000
p7: uint8 = 0b10000000
type
Pcf8574 = ref object
addressDevice: uint8
blockk: I2cInst
buffer: uint8
proc writeBytex(self: Pcf8574, dato:uint8 ) =
let dato = dato.unsafeAddr
writeBlocking(self.blockk, self.addressDevice, dato,1, true)
proc digitaWrite(self:Pcf8574,pin:uint8, value:bool) =
if value == on:
self.buffer = (self.buffer or pin)
writeBytex(self,self.buffer)
elif value == off:
self.buffer = (self.buffer and pin)
writeBytex(self,self.buffer)
when isMainModule:
stdioInitAll()
let expander = Pcf8574(addressDevice: 0x20, blockk: i2c0, buffer: 0b00000000)
const sda = 0.Gpio
const scl = 1.Gpio
const address = 0x20
var buffer:uint8 = 0b00000000
init(i2c0,10000)
sda.setFunction(I2C); sda.pullUp()
scl.setFunction(I2C); scl.pullUp()
let dato = buffer.unsafeAddr
i2c0.writeBlocking(address, dato, 1, true)
sleep(1000)
while true:
digitaWrite(expander,p1,on)
sleep(1500)
digitaWrite(expander,p4,on)
sleep(1500)
digitaWrite(expander,p1,off)
sleep(1500)
digitaWrite(expander,p4,off)
sleep(1500)
Ho anche fatto un piccolo scanner I2C per trovare gli indirizzi dei vari dispositivi che son sempre un incubo. qui puoi trovare le librerie/utility:
https://github.com/Martinix75/Raspberry_Pico.git
ma sono ancora allo stato iniziale.