/raspberry_lab

đŸ¶ Ett projekt för att bygga en tamagotchi Hugo

Primary LanguagePython

raspberry_lab

(Denna sida har mÄnga lÀnkar som Àr enklare att följa/klicka om du istÀllet gÄr till https://bit.ly/2SmYVrj om du lÀser en pappers-version)

Grattis David !!!

Vi tĂ€nkte till din födelsedag skulle fĂ„ ett litet "paket" 🎁 för att tillĂ„ta dig snickra ihop lite enklare elektronik och programmera för att fĂ„ en liten kĂ€nsla över hur enkelt det kan vara om man har intresset 😁

TĂ€nkte att inledningsvis att anvĂ€nda en Raspberry Pi 🍓 vore enklaste för detta Ă€ndanmĂ„l dĂ„ dels kan anvĂ€nda den som en vanlig dator (skriva kod direkt pĂ„ den) men har ocksĂ„ GPIO pinnar som Ă€r nyckeln till detta. Med dessa kan vi bĂ„de lĂ€sa elektroniska signaler (3.3 volt) men ocksĂ„ skicka ut signalet vilket Ă€r toppen för att styra eller lĂ€sa av komponenter.

Som programmerings sprĂ„k finns det flera valmöjligheter, men jag kommer lura över dig till att anvĂ€nda Python 🐍 som bara Ă€r bland de lĂ€ttaste sprĂ„ken att börja med, dessutom Ă€r ett av det bĂ€sta "full-spektrum" (utan begrĂ€nsningar funktionsmĂ€ssigt) enligt min mening, vare det handlar om att utveckla applikationer, webtjĂ€nster, AI, mattematik, skapa automationer i MineCraft ... eller styra mikrokontrolenheter eller i detta fall "mikro datorenhet".

SÄ vilka förberedelser behövs för att köra loss med lite experiment utöver det du fÄtt...

  • En mikrousb laddare (minst 1 ampere) för att fĂ„ liv i Raspberry Pi
  • Hörlurar med vanlig 3,5mm uttag... eller bĂ€ttre en extern högtalare med 3,5mm sladd ingĂ„ng

Bra att ha om du lÀttare ska kunna komma Ät / styra Raspberry Pi

  • TV eller skĂ€rm med HDMI
  • HDMI-kabel
  • Kombinerad tangentbord/mus med USB .... eller en USB-hub (helst med egen strömförsörjning) med tangentbord och mus kopplad till .... detta Ă€r för Raspberry Pi har vĂ€ldigt fĂ„ USB-portar och undviker enheter som drar hög strömstyrka
  • NĂ€tverkssladd (om inte ert wifi fungerar)

Vad Àr allt detta !?!?

Diverse extra komponenter

labdelar_01

Komponenter för tamagotchi hugo

labdelar_02

Hur börjar jag kopplar du in Raspberry Pi.... med skÀrm/tangentbord/mus ..

Jag skulle föreslÄ att du kopplar in sÄ att du Ätminstone kan anvÀnda den som dator antingen genom tangentbord (enklast) och/eller koppla upp frÄn din egna stationÀra dator (jag gÄr genom senare hur).

Sedan ska SD-kortet in i Raspberry PI, samt Wifi USB dongle sÀttas in-

Om du anvÀnder skÀrm + dator/mus sÄ Àr det enda du behöver göra Àr att titta pÄ skÀrmen medan den startar upp.

hur_koppla_ihop_raspberrypi

Kan jag sitta via min dator och styra Raspberry Pi istÀllet ?? ... Ja !!!

I detta fall sÄ klarar du dig utan bÄde skÀrm, tangentbord/mus ... men den mÄste komma in pÄ ert nÀtverk .. förhoppningsvis har jag lyckats för-konfigurera "wifi" USB stickan med ert wifi och kommer automatiskt koppla upp sig (annar kan du följa denna video-klipp för fixa detta), om detta misslyckats sÄ gÄr det utmÀrkt att koppla en nÀtverkskabel direkt frÄn Raspberry Pi till er hemma-router (kommer alltid fungera).

Du kommer behöva IP-addressen till Raspberry Pi, och enklast Àr om du har skÀrmen inkopplad och under uppstart bör du se dess IP-address dyka upp pÄ skÀrmen, ett annat alternativ om du vet hur du kopplar upp mot din router och lÀsa av dÀr ... sista alternativet Àr att anvÀnda ett Windows program (gratis) som exempelvis Fing du kan ladda ned hÀr som bör kunna "scanna" av ditt nÀtverk och lura ut detta Ät dig.

Sedan frÄn din Mac/Windows dator fÄr du ladda ned RealVNC viewer hÀrifrÄn.

Sedan kör du detta program och vÀljer att skapa en koppling mot ovan IP-address, och nÀr den frÄgar efter ett lösenord anger du

username: pi
password: raspberrylab

Var anger jag min kod... Hur kommer jag igĂ„ng? đŸ„ł

NÀr du antingen anvÀnder skÀrmen eller VNC sÄ bör du fÄtt en kod-editor "mu" som Àr inlagd att starta automatiskt (finns Àven i hallon-menyn -> programmering). FrÄn denna vyn, kan du vÀlja "Nytt", "Kör" som du oftast kommer anvÀnda. Alla Python program bör ha filÀndelsen .py

kod_editor

Första exempel med en enkel LED lampa för att bli lite varm i klÀderna och fÄ en kÀnsla ...

.. jag skÀl ett vÀldigt enkelt exempel frÄn denna sida som har mÄnga flera bra exempel att följa jag kan varmt rekommendera att göra... Du bör ha motstÄnd (100 ohm) och LED lampa som du ka koppla in som nedan, din modell har fÀrre pinnar (26 st) Àn bilden visar med de pinnar som visas i dessa exempel ligger pÄ samma plats och med samma nummer sÄ dessa exempel ska fungera lika ..

forsta_exempel.jpg

Om du skriver en kod nu som

from gpiozero import LED
from time import sleep

red = LED(17)

while True:
    red.on()
    sleep(1)
    red.off()
    sleep(1)

Och klickar pĂ„ "Kör" ✅ sĂ„ bör denna lampa blinka till du klickar "Stop" 🛑

Vill du lÀra dig lite med grundlÀggande Python programmering innan vi kör vidare ...?

I sĂ„ fall Ă€r det toppen 🙌... och jag kan varm rekommendera denna seria av YouTube klipp som förklarar mycket enkelt det absolut mest grundlĂ€ggande ..

Python - Grunder - Del 1 - Variabler och listor

Python - Grunder - Del 2 - Villkor och loopar

Python - Grunder - Del 3 - Funktioner

Python svenska - 18 - Klasser och metoder (detta Àr nog lite överkurs men för mitt experiment nedan bra att ha klÀm pÄ)

Nu har du lite klÀm pÄ Python som sprÄk ...

Vill du bekanta dig lite mer med gpiozero biblioteket, hur du anvÀnder Python för att styra GPIO pinnar ...?

Toppen, dĂ„ kan jag rekommendera denna video nedan .. đŸ“Œ

Raspberry Pi - Control GPIO Pins with GPIOzero Library

... du bör nu har du nog fÄtt lite klÀm pÄ hur man kan snacka med saker med Python .. och du kan gÄ vidare och experimentera vidare pÄ egen hand ...

Vilka mer roliga sensorer och komponenter har du att leka med i leklÄdan..?

Jo .. du har dessa och med följande exempel du kan testa med

Om du saknar nĂ„t rekommenderar jag Kjell & Company eller AliExpress đŸ€‘

Vill du ge dig pÄ nÄgot mer avancerat ....?

Om du följer kopplings schemat nedan samt kod exemplet nedan som du kan jobba vidare pĂ„, sĂ„ har du lyckats utvecklat en tamagotchi-hugo .. đŸ¶ + đŸ€–

tamagotchi

Koppla nedan ...

hund_elektronik

PS. "motstÄndet" mot den blÄa "temperatur-sensor" ska vara det motstÄnd som Àr pÄ 47 Kohm (starkare), du har en uppmÀrkt för detta. Det motstÄnd du har för LED Àr de svagare som vi inte har markerat upp och bör vara pÄ 100 ohm eller nÄt.

... och med nedan kod som Ă€r lite mer komplext, men har försökt anvĂ€nda sĂ„ enkel lĂ€tt-lĂ€st kod sĂ„ tror att Ă€ven om inte alla pusselbitar faller pĂ„ plats sĂ„ kommer det mesta visa sig sjĂ€lvförklarande .. det fina med Python đŸ˜đŸ‘đŸ»

# Dessa bibliotek anvÀnds för att förenkla livet
from gpiozero import Device, LED, PWMLED, Button
from gpiozero.pins.mock import MockFactory
from unittest.mock import Mock
import pygame.mixer as mixerenhet
import time
import sys
from cowsay import kitty as sÀger

# Detta Àr en s.k. "konstant" variabel bara för göra koden mer lÀttlÀst lÀngre ned
EN_SEKUND = 1

# Alla delar (objekt) utav hunden som kommer anvÀndas med lÀttlÀsta namn
vÀnster_öga = LED(23)
höger_öga = LED(24)
nos = PWMLED(18)
mun = Button(22)
hörsel = Button(27)
temperatur_pinne = 25

# Detta Àr i objekt-orienterad-programmering en "klass" som representerar en hund
class Hund():
    def __init__(self, namn):
        # En hund har "egna" egenskaper som inte behöver vara samma för andra hundar
        self.namn = namn
        self.hjÀrtslag_rÀknare = 0
        self.födsel_temperatur = self.kÀnn_temperatur()  # Vad Àr temperaturen vid födsel för att jÀmföra med senare
        # NÀr vi föder en hund vill vi att den ska veta/göra följande
        hörsel.when_activated = self.apport  # Detta Àr en s.k. "callback" sÀger att den hörsel (ljud sensor) registreras ska han "apport"
        mun.when_activated = self.Àt  # Detta Àr motsvarande nÀr hunden matas (knappen) sÄ ska han köra metoden "Àt"
        sÀger(f"Vov!!! nu Àr jag född och jag heter {self.namn}...\n"
              f"Nu nÀr jag föddes sÄ Àr jag {self.födsel_temperatur} grader")
        mixerenhet.init()  # Detta Àr bara för att initiera ljudenheten pÄ Raspberry Pi
        self.skÀll()  # Ge ett skall

    def slÄ_hjÀrtslag(self, hjÀrtslag_per_sekund=10):
        # Denna "metod" bestÀmmer hur ofta/regelbundet hjÀrtat ska slÄ, högre = högre hastighet pÄ rÀknaren
        time.sleep(EN_SEKUND / hjÀrtslag_per_sekund)
        self.hjÀrtslag_rÀknare = self.hjÀrtslag_rÀknare + 1

    def nollstÀll_hjÀrtslag(self):
        # Vi anvÀnder denna för att bestÀmma "intervaller" mellan exempelvis hur ofta hunden ska kÀnna pÄ sin pÀls
        self.hjÀrtslag_rÀknare = 0

    def kÀnn_temperatur(self, pinne=temperatur_pinne, antal_försök=10, normal_temp=23):
        # Denna metod/egenskap kommer lÀra hunden att kÀnna pÄ sin pÀls
        fuktighet, temperatur = temperatur_lÀsare(temperatur_enhet, pinne, retries=antal_försök)
        return temperatur or normal_temp

    def dax_att_kÀnna_efter(self, efter_hur_mÄnga_hjÀrtslag=100):
        # Denna metod Àr enbart för att svara pÄ frÄgan om det Àr dags för hunden att kÀnna efter sin pÀls igen baserad pÄ vÄr "rÀknare" vi ökar resp. nollstÀller vid behov
        self.hjÀrtslag_rÀknare = self.hjÀrtslag_rÀknare + 1
        if self.hjÀrtslag_rÀknare > efter_hur_mÄnga_hjÀrtslag:
            self.nollstÀll_hjÀrtslag()
            return True
        else:
            return False

    def blinka_ögonen(self, tid=0.5, antal=6):
        # Denna metod bestÀmmer hur hunden ska blinka med sina ögon
        vÀnster_öga.blink(on_time=tid, off_time=tid, n=antal)
        höger_öga.blink(on_time=tid, off_time=tid, n=antal)

    def pulsera_nosen(self, tid_sekunder=1, antal=4):
        # Denna metod bestÀmmer hur hundens nÀsta ska pulsera
        nos.pulse(fade_in_time=tid_sekunder, fade_out_time=tid_sekunder, n=antal, background=False)

    def apport(self):
        # Denna metod kallar vi pÄ nÀr vi vill att han ska springa apport
        print(self.namn, 'springer apport 🩮')
        self.blinka_ögonen(0.2, 10)  # Snabbare Àn vanligt
        self.skÀll()

    def Àt(self):
        # Denna metod talar om vad som hÀnder nÀr hunden Àter
        print(self.namn, 'Ă€ter gladligen 🌭')
        self.blinka_ögonen()
        mixerenhet.music.load('ljud/eat.mp3')  # Detta spelar upp ljudet "eat.mp3" som ska ligga i katalogen ljud
        mixerenhet.music.play()

    def skÀll(self):
        # Denna metod lÀr hunden hur han ska lÄta nÀr han skÀller
        mixerenhet.music.load('ljud/vov.mp3')
        mixerenhet.music.play()

    def lev(self, vÀrmeslag_temparatur_ökning=1):
        # Denna metod kallar som sista steg vid "init" (födsel) nÀr valpen börjar leva
        while True:
            self.slÄ_hjÀrtslag()  # Vi slÄr ett hjÀrtslag
            if self.dax_att_kÀnna_efter() is True:  # Bara om tillrÀckligt mÄnga hjÀrtslag ska hunden kÀnna efter
                temperatur_just_nu = self.kÀnn_temperatur()  # ... dÄ ska han kÀnna efter temperatur
                print("Grr.. min pÀls just nu Àr", temperatur_just_nu, "grader")
                if temperatur_just_nu is not None and temperatur_just_nu >= self.födsel_temperatur + vÀrmeslag_temparatur_ökning:
                    # Om temeperaturen överstiger vÀrmeslag ska vi göra nedan
                    print('đŸ„”')
                    self.pulsera_nosen()


# HĂ€r börjar huvud programmet ... NU KÖR VI !!!!
hugo = Hund(namn='Hugo')  # Vi föder en ny "Hund" med namnet Hugo
hugo.lev()  # Vi talar för hugo att börja leva .... "It's ALIIIIIIVE ... " (citat frĂ„n "Frankenstein") 🧛

... nu .. detta Ă€r bara en början .. med de sensors som du har i arsinalen bör du antingen kunna börja nytt projekt eller lĂ€gga till flera egenskaper till en Hugo version 2.0 ... 3.0 ... đŸ€“

Vill du tjuvtitta sÄ har du ett YouTube klipp hÀr hur det hela blev ...

hugo_animation

Lite tips pĂ„ andra projekt du kanske gĂ„r snickra pĂ„ med de dela du fĂ„tt .. 💡

  • Inbrottslarm? Vi kan skicka mail (jag kan ge dig tips hur) nĂ€r detta sker
  • LĂ€sa av avstĂ„ndet nĂ€r bilen Ă€r parkerad hemma?
  • Skicka en vĂ€ck signal nĂ€r det blir tillrĂ€ckligt ljust i rummet?

Ha kul .... 🎊