Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Pavlovs Kat

Componenten en benodigdheden

Arduino MKR IoT-bundel
× 1

Apps en online services

Telegram

Over dit project

Opmerking:deze tutorial kan verouderd zijn, ga naar hier voor een meer actuele versie.

Als je ooit hebt geprobeerd een kat te trainen, weet je hoe moeilijk het is. Katten zijn hun eigen meesters, maar nu heb je de kans om de katten je bod te laten doen met dit IoT-apparaat.

Welkom bij het kattenexperiment van Pavlov!

In dit project leer je hoe je je kat kunt leren wanneer het (en niet) etenstijd is met alleen de componenten in de MKR IoT-bundel en wat karton.

En we weten allemaal dat katten al dol zijn op kartonnen dozen!

Elke keer dat de kat een bepaalde melodie hoort, krijgt hij eten. Een lichtsensor detecteert de aanwezigheid van een kat. Een andere melodie doet niets. Zie je hoe dit zal werken?

U kunt de voortgang van uw kat in de loop van de tijd volgen en de voerdosering vanaf uw telefoon instellen. Zodra u bevredigende statistieken hebt bereikt, is het tijd om de sensor opnieuw te gebruiken in een wearable. Je kat zou je vanaf dat moment moeten volgen als je dat piepgeluid maakt.

Disclaimer:er zijn geen katten gewond geraakt bij de ontwikkeling van dit experiment. Ook geen garantie dat de kat het voer zal opeten, maar je snapt het wel, toch?

In een notendop

U kunt uw eigen voedselautomaat bouwen door deze eenvoudige stapsgewijze instructies te volgen. De dispenser is eigenlijk gewoon wat karton en een servomotor met wat extra Arduino-magie.

Met behulp van een berichtenservice genaamd Telegram kun je de hoeveelheid voedsel instellen die moet worden verstrekt en de melodieën activeren die met de zoemer worden afgespeeld.

Een lichtsensor wordt gebruikt om te detecteren of de kat op de melodie reageerde en bij het eten kwam.

Pro-tip: U kunt een webpagina hosten op de MKR1000 en de verzamelde gegevens weergeven in een handige tabel.

Componenten

  • Servomotor
  • Fototransistor
  • 220 ohm weerstand
  • Zoemer

Leerdoelen

In dit experiment leer je hoe je:

  • Beheer Telegram Bots met een aangepast toetsenbord
  • Webserverfunctionaliteit instellen en beheren vanaf de MKR1000 zelf. #ProTip

Pro-tips zijn nuttige maar niet strikt noodzakelijke stappen die een extra laag complexiteit aan het project toevoegen.

Meer weten?

Deze tutorial maakt deel uit van een reeks experimenten die je vertrouwd maken met de MKR1000 en IoT. Alle experimenten kunnen worden gebouwd met behulp van de componenten in de MKR IoT-bundel.

  • Ik hou van je kussen
  • Puzzeldoos
  • Pavlovs kat
  • De nerd
  • Plantencommunicator

Telegram en Arduino

Telegram is een populaire berichten-app voor zowel mobiel als desktop. Behalve dat we met onze vrienden kunnen chatten, kunnen we ook handige en krachtige chatbots maken!

De TelegramBot-bibliotheek voor Arduino biedt ons een gemakkelijke manier om de logica achter de chatbot te implementeren.

Bekijk de I Love You Pillow-tutorial om te leren hoe je een Bot maakt en basisfuncties beheert.

Maak je eigen toetsenbord

Met Telegram kunnen we een aangepast toetsenbord maken voor snelle antwoorden. Dit betekent dat wanneer u met een bot praat, een bepaalde selectie van knoppen wordt weergegeven in plaats van het standaardtoetsenbord. U kunt deze knoppen eenvoudig aanpassen en de gebruikerservaring van uw apparaat verbeteren.

Ons aangepaste toetsenbord ziet er als volgt uit:

We zullen de eerste rij knoppen gebruiken om de melodie te spelen en voedsel uit te delen, terwijl de tweede rij knoppen zal worden gebruikt om de snelheid van de servomotor in te stellen en dus de hoeveelheid voedsel die moet worden afgegeven.

Om een ​​aangepast toetsenbord te maken, moeten we het eerst declareren:

TelegramToetsenbord keyboard_one;  

Definieer vervolgens de rijen:

 const char* row_one[] ={MusicAndFood, MusicNoFood}; const char* row_two[] ={OnePortion, TwoPortion, ThreePortion};  

En wijs tenslotte de rijen toe aan het toetsenbord:

keyboard_one.addRow(row_one, 2); // wijs een rij toe aan een of meer toetsenborden keyboard_one.addRow(row_two, 3); // tweede argument is de lengte van de rij  

Onthoud dat een emoji moet worden verzonden met UNICODE. Om bijvoorbeeld een emoji met een hartje te sturen, gebruiken we:\U00002764

Je kunt de volledige lijst met unicode-emoji-codes hier bekijken. Het betekent dat we dit zullen gebruiken om onze knoppen te definiëren:

 const char* MusicAndFood ="\U0001F3B6 + \U0001F36A"; // Opmerking + Cookie const char * MusicNoFood ="\U0001F3B6 NO \U0001F36A"; // Opmerking GEEN Cookie const char * OnePortion ="\U0001F408"; // CAT const char* TwoPortion ="\U0001F408 \U0001F408"; // 2 CATS const char* ThreePortion ="\U0001F408 \U0001F408 \U0001F408"; // 3 KATTEN  

Hier is de volledige schets:

#include  #include  #include  const char* ssid =SECRET_SSID; // uw netwerk SSID (naam) const char* wachtwoord =SECRET_PSWD; // uw netwerkwachtwoord const char BotToken [] =SECRET_BOT_TOKEN; WiFiSSLClient-client; TelegramBot-bot (BotToken, klant); TelegramToetsenbord keyboard_one; String OldChatId =""; void setup() { Serial.begin(115200); vertraging (3000); // probeer verbinding te maken met wifi-netwerk:Serial.print ("Verbinden met wifi:"); Serieel.println(ssid); while (WiFi.begin(ssid, wachtwoord) !=WL_CONNECTED) { Serial.print("."); vertraging (500); } Serieel.println(""); Serial.println("WiFi verbonden"); // kies de emoji die je leuk vindt met UNICODE // hier is de lijst https://unicode.org/emoji/charts/full-emoji-list.html const char* MusicAndFood ="\U0001F3B6 + \U0001F36A"; // Opmerking + Cookie const char * MusicNoFood ="\U0001F3B6 NO \U0001F36A"; // Opmerking GEEN Cookie const char * OnePortion ="\U0001F408"; // CAT const char* TwoPortion ="\U0001F408 \U0001F408"; // 2 CATS const char* ThreePortion ="\U0001F408 \U0001F408 \U0001F408"; // 3 CATS // definieer de const van je rij char* row_one[] ={MusicAndFood, MusicNoFood}; const char* row_two[] ={OnePortion, TwoPortion, ThreePortion}; keyboard_one.addRow(row_one, 2); // een rij toewijzen aan een of meer toetsenborden keyboard_one.addRow(row_two, 3); // tweede argument is de lengte van de rij bot.begin(); } void loop() { bericht m =bot.getUpdates(); // Lees nieuwe berichten if (m.chat_id!=0) { // Controleert of er updates zijn OldChatId =m.chat_id; Serial.println(m.tekst); bot.sendMessage(m.chat_id, "Hallo!", keyboard_one); } vertraging (1000); }  

Helaas is de manier waarop de bot de emoji's verstuurt niet dezelfde als waarmee ze werden ontvangen. Het gebruik van het EchoBot-voorbeeld is een gemakkelijke manier om te zien hoe bots emoji ontvangen.

De emoji die we gaan gebruiken, wordt bijvoorbeeld als volgt ontvangen:

ud83cudfb6 // Melodie ud83cudf6a // Cookieud83dudc08 // Kat 

Detecteer de kat!

Om de aanwezigheid van de kat te detecteren, gebruiken we een fototransistor, die de lichtintensiteit kan meten en dus of iemand er dichtbij is geweest.

Merk op dat we een weerstand van 220 ohm hebben gebruikt.

Om waarden van de sensor te lezen, hebben we alleen een analogRead(A6) nodig.

Omdat we alleen geïnteresseerd zijn in het detecteren van de aanwezigheid van de kat na de melodie, en slechts voor een bepaalde tijd, kunnen we de volgende logica gebruiken:

unsigned long timer;bool startDetecting =true;int threshold=200; // arbitrary valuevoid setup(){timer=millis()Serial.begin(9600);} void loop(){if (startDetecting) {int value =analogRead(A6); if (waarde  120000) { Serial.println("geen kat gedetecteerd in de afgelopen twee minuten"); startDetecting =false; } } } 

Merk op dat we de . gebruiken millis() functie om een ​​timer in te stellen . Millis() geeft ons de tijd in milliseconden sinds het bord in gebruik was. We kunnen het gebruiken om timers in te stellen en gebeurtenissen te activeren na een bepaalde tijd.

We gebruiken ook een drempel om te bepalen of de kat is gedetecteerd. Die drempel is willekeurig, je kunt hem aanpassen aan je lichtconditie.

Speel het nummer af

Om het nummer af te spelen gebruiken we de zoemer en de tone() functie.

We zullen een licht aangepaste versie van het standaardvoorbeeld toneMelody gebruiken. Je kunt het vinden in het vervolgkeuzemenu:

voorbeelden> digitaal> toneMelody. 

Voeg de servomotor toe

De servo wordt gebruikt om de doos te openen en eten te bezorgen.

Merk op dat we een variabele gebruiken int PortionAmount =1; om in te stellen hoe lang de servo 90 graden gedraaid moet blijven. We kunnen de waarde ervan wijzigen via Telegram.

Bevestig de servo aan pin 7 en upload deze schets om te zien hoe hij werkt.

#include  Servo myservo; // maak een servo-object om een ​​servo int pos =0 te besturen; // variabele om de servopositie op te slaan in PortionAmount =1; // Stel de standaardhoeveelheid voedsel in op 1 portie void setup () { myservo.attach (7); // bevestigt de servo op pin 6 aan het servo-object} void loop () { moveServo (); vertraging (2000); } void moveServo() { Serial.println ("bewegende servo"); for (pos =0; pos <=90; pos +=1) {// gaat van 0 graden naar 90 graden myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt} vertraging (PortionAmount * 300); // houd de doos open voor een tijdsinterval op basis van de hoeveelheid voedsel waarvoor je wilt bezorgen (pos =90; pos>=0; pos -=1) { // gaat van 90 graden naar 0 graden myservo.write( pos); / vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } }  

#ProTip:voeg een webserver toe

Een van de krachtigste functionaliteiten van de MKR1000 is de Access Point Mode.

Hiermee kunnen we een webpagina hosten op de MKR1000 waartoe we toegang hebben door het IP-adres van de kaart te gebruiken en verbonden te zijn met hetzelfde netwerk .

We zullen deze tool gebruiken om de gegevens af te drukken die zijn verzameld door de voedselautomaat.

Voor deze stap is basiskennis van HTML en CSS vereist (of veel vertrouwen in de voorbeeldschets. U kunt het basiswebservervoorbeeld bekijken op:

> voorbeeld> WiFi101> AP_SimpleWebServer 

We activeren de toegangspuntmodus door een specifiek woord te sturen naar onze Telegram Bot, die zal antwoorden met de link om de webpagina te bereiken. Dan wordt de telegramclient losgekoppeld en de webserver wordt gestart.

else if(m.text =="Server"){ IPAddress ip =WiFi.localIP(); web_server_mode=waar; String message ="Ga naar http://"+IpToString(ip) om de webpagina te zien; bot.sendMessage (m.chat_id, bericht, toetsenbord_één); telegram_client.stop(); vertraging (1000); server.begin(); // start de webserver op poort 80 }  

De webpagina bevat een knop die de webservermodus uitschakelt en teruggaat als telegramclient:

if (currentLine.endsWith ("GET /BACKBUTTON")) { // if button ingedrukt web_server_mode=false; klant.stop(); vertraging (1000); bot.begin(); bot.sendMessage(OldChatId, "Terug online!", keyboard_one); }  

Elke keer dat de kattendetectie wordt beëindigd, wordt een nieuwe cel van de tabel toegevoegd met de verzamelde gegevens:of er eten werd bezorgd, of de kat binnen twee minuten kwam opdagen en hoe lang het duurde om de dispenser te bereiken.

AddTableCell(food/noFood, Ja/Nee, TimeValue);  

Vervolgens wordt de String met alle tabelcellen bijgewerkt en geïntegreerd in de rest van de hoofd-html.

 table_cells+=cel; // voeg nieuwe cel toe html =html_1 + table_cells + html_2; // voeg cellen toe aan hoofd-html 

Bekijk het laatste Pro-voorbeeld om te zien hoe je al deze nieuwe functionaliteiten kunt integreren!

Tip: als je wilt dat je gegevens een reset van het bord overleven, kijk dan eens in de Flash Storage-bibliotheek of bekijk het Nerd-project!

Code

Volledige schets
#ProTips complete schets

Aangepaste onderdelen en behuizingen

2 mm karton pavlovcase_ShVm1OJRIF.dxf

Schema's


Productieproces

  1. Bevroren groente
  2. Tv-diner
  3. CAT-scanner
  4. Kattenbak
  5. Gevriesdroogd voedsel
  6. Voedsel voor huisdieren
  7. Metaaldetecteerbare kunststoffen in de voedingsindustrie
  8. Uw gids voor Shop.Cat.Com
  9. Aan de slag met My.Cat.com
  10. Automatische voedselautomaten - Productveelzijdigheid
  11. Eten is nu nog sneller geworden