Skocz do zawartości

Micropython Reference Raspberry Pi Pico


Pomocna odpowiedź

Rozdzieliłem chłodzenie karty od reszty układu do wykonania drobnych testów z pico.

 

20220222_203101.thumb.jpg.9a120412198d21029f2f06b5c05f9e7b.jpg

 

Dokumentacja podaje , że pico może być taktowane do około 400MHz. Standardowe taktowanie jakie podaje machine.freq() to 125MHz. Temperatura rdzenia przy standardowym taktowaniu wyniosła u mnie 20 stopni. Poniżej platforma testowa 🙂

 

20220226_215809.thumb.jpg.7af29031ce38869d134fe597a155fd78.jpg

 

Przy obrotach turbiny na poziome 20% temperatura rdzenia spadła o około 3,5 stopnia. Co ciekawe zwiększenie obrotów turbiny nie powodowało zmniejszenia temperatury rdzenia. Jako benchmark posłużył generator liczb pierwszych z zakresu 900 do 5000. Testy robiłem zmieniając taktowanie co 10MHz. Przy standardowym taktowaniu czas generowania liczb pierwszym to około 11 s. Natomiast przy taktowaniu rdzenia na poziomie 240 MHz to niewiele ponad 6s. Natomiast temperatura rdzenia przy taktowaniu 240 MHz z aktywnym chłodzeniem wyniosła około 19 stopni (czyli była niższa o jeden stopień względem taktowania 125 MHz bez chłodzenia). Układ sterujący silnikiem to L293 a nie L298. @Gienek mógł bym poprosić aby przenieść dwa ostatnie posty do oddzielnego tematu? Dział i tytuł sam wybierz. Co jakiś czas będę zamieszczał jakieś "ciekawostki".

Link to post
Share on other sites

Dla osób, które chciały by wykonać w/w test podaje kod z , którego korzystałem w zasadzie to dwie funkcje (z neta). Najlepiej umieścić je w folderze lib w pico. 

from machine import ADC
import utime

def prime(lower,upper):
    print('Prime numbers between', lower, 'and' , upper, 'are:')
    start = utime.ticks_ms()
    for num in range (lower, upper + 1):
        if num> 1:
            for i in range(2,num):
                if(num % i) == 0:
                    break
            else:
                print(num)
    end = utime.ticks_diff(utime.ticks_ms(), start)
    print('czas ' ,end/1000)
                
def coretemp():
    temperature = ADC(4)
    conversion = 3.3 / 65535
    reading = temperature.read_u16()* conversion
    core_temperature = 27 - (reading - 0.706)/0.001721
    return core_temperature

teraz wystarczy wpisać z REPL

from libtest import prime, coretemp # plik z funkcjami nazwałem libtest.py

i wywołać print(coretemp()) lub prime z zadanymi parametrami. Serię pomiarów można wykonać przy użyciu timera

from machine import Timer
tim= Timer(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(coretemp()))

soft reset można zrobić kombinacją klawiszy ctrl + D. Jeśli ktoś chce się bawić przez dłuższy czas i mieć "timestam" to obsługa RTC sprowadza się do

from machine import RTC
RTC().datetime()

W załączniku zamieszczam sterownik dla pico pod win 7 32bit (do instalacji ręcznej) .exe ani gotowego inf nie znalazłem. Pobrałem ze strony microchipa i zmodyfikowałem zgodnie z instrukcją na forum pico.

 

pico-serial.zip

  • Lubię! 1
Link to post
Share on other sites

"W Pico PWM jest obsługiwany przez Slice oraz kanały. Mamy do dyspozycji 8 slice’ów, gdzie każdy ma po dwa kanały, Niektóre kanały sa przypisane do różnych pinów Pico co obrazuje poniższa ilustracja. Literami oznaczone są kanały, a cyframi numer slice’a."

Nie znam terminu "slice" . nigdzie nie napisano

 

Dnia 5.02.2022 o 16:25, slon napisał:

ciekawa płytka  z RP2040 🙂

Nie używej nigdy CircuitPython - Adafruit wymyślił to dla "wypychania w świat" swoich płytek - "elektrośmieci" . Ciągle coś zmieniają .

Natomiast Micropython - to wkład Społeczności i dobrze się rozwija. Zazwyczaj soft jest wysokiej jakości.

Link to post
Share on other sites

Na chwilę obecną CirciutPythona nie używałem. Oglądałem kiedyś porównanie obydwu tych wersji i tyle zapamiętałem, że Micropython miał nieco większe możliwości ale o co dokładnie chodziło to już nie pamiętam.

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dzisiaj sprawdziłem jak to jest z oszczędnością miejsca/pamięci dla plików .mpy. Dla podanego przykładu z dwoma funkcjami jest to prawie dwukrotna oszczędność miejsca. Potrzebne będą narzędzia mpy-cross oraz ampy. @wr90 możesz napisać coś więcej odnośnie CircuitPython? Na forum jest projekt , który jest oparty właśnie na CircuitPython i wygląda bardzo ciekawie.

Link to post
Share on other sites

Przykład zapisu czasu do pliku. Plik: tekst.txt (czy jak kto sobie go nazwie) trzeba sobie stworzyć katalogu '/' pico.

from machine import RTC,Pin
from libtest import coretemp

GODZINA = const(4)
MINUTA = const(5)
SEKUNDA = const(6)

LOW = const(0)
HIGH = const(1)
LED_BUILDIN = const(25)

ledpin = Pin(LED_BUILDIN, Pin.OUT)

while RTC().datetime()[MINUTA] < 59:
    if RTC().datetime()[SEKUNDA] ==30:
        if ledpin.value()==LOW:
            ledpin.on()
            print(RTC().datetime(), coretemp())
            f = open('tekst.txt')
            f.write(str(RTC().datetime()))
            f.close()
            
    elif RTC().datetime()[SEKUNDA] ==59:
        if ledpin.value()==HIGH:
            ledpin.off()
            print(RTC().datetime(), coretemp())

następnym razem pokombinuję coś z HC-05.

Link to post
Share on other sites

Miało być o HC-05 ale jakoś nie bardzo chce mi się do tego zabrać z uwagi na to , że lepiej chyba by było kupić esp. Pokombinowałem trochę z ADkeypad . Taka przykładowa funkcja, którą można wywołać po podłączeniu do pico (3,3 , gnd, i pin 28_A2). Na początek bez wciskania klawiszy:

def adkeypad(read=10,result='lista'):
    adkey = ADC(2)
    lista = []
    average = 1
    for i in range(read):
        reading = adkey.read_u16()
        lista.insert(i,reading)
        average += reading
    lista.sort()
    if result == 'lista':
        return lista
    elif result == 'average':
        average /= read
        return average

w terminalu dostaniemy coś takiego:

>>> adkeypad()
[53789, 53853, 53853, 53869, 53901, 53933, 54029, 54189, 54189, 54429]

lub

>>> adkeypad(5,'average')
54029.2

Następnie można spróbować takiej paskudnej funkcji 🙂

def adkeymap(keys=16,write=False):
    key_list = []
    for i in range(keys):
        print('wciśnij k',i)
        while adkeypad(10,'average') >52000:
            utime.sleep_ms(100)
        key_list.insert(i,adkeypad())
        print(key_list[i])
        utime.sleep_ms(1000)
        while key_list[i][0]<adkeypad(10,'average')<52000:
            utime.sleep_ms(100)
    if write==True:
        f = open('tekst.txt')
        for i in key_list:
            f.write(str([i]))
            f.write("\r\n")
        f.close()
    return key_list

w terminalu wygląda to tak:

>>> pomiar = adkeymap()
wciśnij k 0
[416, 432, 432, 432, 432, 432, 432, 432, 464, 496]
wciśnij k 1
[4289, 4369, 4385, 4385, 4385, 4385, 4401, 4401, 4417, 4417]
wciśnij k 2
[8145, 8145, 8145, 8177, 8177, 8177, 8177, 8177, 8177, 8177]
wciśnij k 3
[11650, 11666, 11666, 11682, 11714, 11714, 11746, 11746, 11746, 11762]
wciśnij k 4
[15059, 15059, 15075, 15075, 15107, 15123, 15155, 15155, 15219, 15235]
wciśnij k 5
[18372, 18388, 18404, 18452, 18468, 18516, 18548, 18564, 18580, 18580]
wciśnij k 6
[21605, 21669, 21685, 21701, 21701, 21717, 21749, 21781, 21797, 21813]
wciśnij k 7
[24774, 24774, 24838, 24854, 24902, 24934, 24966, 24982, 24982, 25014]
wciśnij k 8
[27910, 27926, 27942, 27942, 27942, 27990, 28038, 28102, 28134, 28246]
wciśnij k 9
[31063, 31127, 31159, 31175, 31207, 31223, 31255, 31287, 31319, 31479]
wciśnij k 10
[34312, 34408, 34424, 34440, 34488, 34488, 34536, 34568, 34584, 34616]
wciśnij k 11
[37401, 37417, 37417, 37433, 37449, 37513, 37561, 37577, 37577, 37641]
wciśnij k 12
[40585, 40633, 40633, 40633, 40649, 40713, 40729, 40729, 40809, 40873]
wciśnij k 13
[43802, 43866, 43882, 43914, 43914, 43930, 43994, 43994, 44138, 44138]
wciśnij k 14
[47259, 47307, 47355, 47387, 47403, 47419, 47435, 47435, 47499, 47531]
wciśnij k 15
[50620, 50620, 50620, 50652, 50668, 50684, 50732, 50828, 50876, 50876]

Można też dokonać jednocześnie zapisu wartości do pliku dla innej liczy klawiszy np:

adkeymap(7,True)

czyli 7 klawiszy i zapis wartości do pliku.

 

  • Lubię! 1
Link to post
Share on other sites

HC-05 sprawdzone. Chociaż na początku się zamotałem z prędkościami. Pamiętałem , że zmieniałem br ale na jaką wartość to już zapomniałem. Wiec zacząłem od 4800 aż doszedłem do poprawnej wartości.

from machine import UART, Pin
uart0 = UART(0, baudrate=57600, tx=Pin(16), rx=Pin(17))
uart0.write(str(adkeypad(6,'lista')))

 

Link to post
Share on other sites

Miałem w planie uruchomić REPL przez UART ale jeśli , ktoś chciał by pisać/przesyłać kod z telefonu czy innego urządzenia do pico a następne go uruchomić to odblokowywanie nie jest potrzebne. Zakładając , że już jesteśmy połączeni z HC-05. Z telefonu wysyłamy:

print(machine.unique_id())

teraz w REPL

f= open('test.py')
f.write(uart0.read(29))
f.close()
  

W pliku test.py już powinniśmy mieć zapisane to co wysłaliśmy z BT ale dobrze jest to sprawdzić. W tym celu wpisujemy dalej

f= open('test.py').read()
f

Powinniśmy dostać coś takiego:

'print(machine.unique_id())\r\n'

Można zwrócić uwagę , że na końcu mamy \r\n , którego nie wpisałem bo ustawiłem to w aplikacji (na dodatkowe znaki trzeba oczywiście zarezerwować miejsce w buforze). Teraz zostaje już tylko uruchomić plik test:

exec(open('test.py').read())

w odpowiedzi dostaniemy indywidualny nr procka:

b'\xe6`8\xb7\x13:\x14/'

W ten sposób można testować np: nowe funkcjonalności. 

Link to post
Share on other sites

Zrobiłem trochę testów z wysyłaniem plików przez BT. Ogólnie przebiegły pozytywnie choć nie jest to na pewno optymalny sposób. Do wysyłania plików z telefonu użyłem Serial bluetooth Terminal. Wysyłanie jako Line (Line delay =100). Przed rozpoczęciem wysyłania pliku można skorzystać z takiej funkcji:

def writefile(name='test.py',sendback=False):
    bt = UART(0,baudrate=57600, tx=Pin(16), rx=Pin(17))
    f= open(name)
    while True:
        buffer = bt.read(265)
        if buffer != None:
            if buffer == b'koniec\r\n':
                f.close()
                if sendback:
                    f= open(name).read()
                    bt.write(f)
                soft_reset()
            f.write(buffer)
            utime.sleep_ms(50)

Następnie wysłać plik i po zakończeniu jego wysyłania wysłać polecenie: koniec. Zapis do czystego pliku przebiegał bez problemów. Jeśli chcemy bezpośrednio po wysłaniu pliku sprawdzić poprawność jego zapisu to wpisujemy:

writefile('test.py',True)

Zawartość pliku zostanie wyświetlona w telefonie. Próbowałem zmniejszyć delay w podanej funkcji ale zdecydowana większość prób kończyła się niepoprawnym zapisem do pliku.  Max. RX buf dla HC-05 (bynajmniej tego, który posiadam to 265). Jako ciekawostkę w tym temacie można obejrzeć ten filmik

  • Lubię! 2
Link to post
Share on other sites

Bardziej uniwersalna opcja, która wyświetla listę plików i tworzy plik o podanej nazwie (jeśli plik istnieje zawartość jest kasowana)

from machine import UART,Pin, soft_reset
import utime,os

def writefile():
    bt = UART(0,baudrate=57600, tx=Pin(16), rx=Pin(17))
    for i in os.listdir():
        bt.write(i)
        bt.write("\r\n")
    bt.write('\r\nenter file name\r\n')
    name = bt.read(265)
    while name == None:
        name = bt.read(265)
        utime.sleep_ms(50)
    bt.write('select file to upload')
    f= open(name[:-2], 'w')
    while True:
        odczyt = bt.read(265)
        if odczyt != None:
            if odczyt == b'koniec\r\n':
                f.close()
                soft_reset()
            f.write(odczyt)
            utime.sleep_ms(50)

 

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.