Anti Kind Teddybeer
Voor een school project heb ik een teddybeer gemaakt die niet bedoeld is voor kinderen. Als je op zijn neus drukt maakt hij een luid buzzer geluid en worden zijn ogen rood, en als je in zijn poot knijpt roep hij 'au' of 'fuck'. En wanneer je de teddybeer omdraait zegt hij; 'blijf van me af' of 'wegwezen!'
Supplies
Elektronische componenten
- arduino Uno
- ADXL345 Accelerometer
- Transistor BC547 NPN 45V / 0,1A
- Arcade knop 30mm
- Breadboard jumper kabeltjes
- Druk sensor FSR402
- 4 ohm 3 wat speaker
- 9 volt batterij met aansluit kabel
- 3x weerstand 120 ohm
Gereedschap
- schaar
- soldeerbout
- rol soldeertin
- boormachine
- lijm
- naald en draad
- oude teddybeer
Het Begin En De Accelerometer Testen
Ik wist in het begin al wat ik wilde gaan doen, en de docent had mij aangeraden om naar een accelerometer te gaan kijken. Na wat research had ik er zelf een besteld en uitgeprobeerd. Ik had een youtube tutorial gevolgd die vertelde hoe alles in elkaar zat met de code erbij van hoe je de accelerometer kan aflezen en monitoren.
Alles Bij Elkaar Op Het Breadboard
Geluid
Als eerste ging ik aan de slag met het geluid. Ik had op internet ook een tutorial gevonden hoe je geluid moet afspelen met arduino, en ging aan de slag. Als eerste moest ik de library PCM.h uploaden naar mijn arduino, de PCM.h library kon ik via een zipfile downloaden die samen kwam met een audio converter. Vervolgens kon ik kleine 8 bit audio bestandjes opnemen en in de converter stoppen, die er een getallenlijst van frequenties van maakt om in mijn arduino code te gebruiken.
code:
#include <PCM.h>
const unsigned char turn[] PROGMEM = {
*insert frequentie list*
{
Vervolgens kon ik simpel het geluidsbestand aanroepen dat hij moet afspelen met een regel code.
startPlayback(turn, sizeof(turn));
accelerometer
Ik kan dan vervolgens zeggen dat als de accelerometer ondersteboven staat hij een geluidje moet afspelen.
code:
(trigger zorgt er voor dat de beer een keer terug gedraaid moet worden voordat hij nog een keer geluid mag maken)
if (Y_out > 30){
trigger = 0;
}
if (Y_out < 10 && trigger < 1 && 25 > sound){
startPlayback(wegwezen, sizeof(wegwezen));
delay(1500);
trigger = 1;
}
if (Y_out < 10 && trigger < 1 && 25 < sound){
startPlayback(afblijven, sizeof(afblijven));
delay(1500);
trigger = 1;
}
Knop
Hetzelfde kan ik doen als de knop ingedrukt word
code:
if (buttonStatus != 1 && 25 < sound) {
startPlayback(auw, sizeof(auw));
delay(1300);
}
if (buttonStatus != 1 && 25 > sound) {
startPlayback(fok, sizeof(fok));
delay(1300);
}
afwisselen tussen geluid
je kan het al zien aan de code dat in de if statement staat dat als de random variabelen genaamd sound onder de 25 zit hij het ene geluid af moet spelen en boven de 25 het andere geluid. Zodat hij tussen 2 geluiden afwisselt. Ik heb dus een variabele gemaakt die een random getal pakt tussen de 1 en 50.
druk sensor en lampjes
als allerlaatste heb ik een druk sensor gebruikt, en als die ingedrukt wordt speelt hij een buzzer geluid af. En gaan de 2 ledlampen aan.
code:
if (fsrReading > 100){
tone(buzzer, fsrReading * 2)
}
digitalWrite(LED1, fsrReading);
digitalWrite(LED2, fsrReading);
Solderen
Als eerste heb ik voordat ik ging beginnen een circuit getekend op papier. En heb ik de soldeerbout er bij gepakt die ik heb liggen. Toen ik eenmaal een goed overzicht had van wat waar moest ben ik begonnen met solderen.
Ik heb als eerst een + en een - lijn gemaakt. En heb daarna heb ik de rest gesoldeerd. Bij de ledlampen, knop en druksensor heb ik een stuk van het bord afgeknipt. omdat die in het hoofd van de teddybeer gaan en los van de rest zitten. Het ging makkelijker om ze via het bord met de draadjes te solderen dan direct.
Tijdens het proces had ik wel een van mijn knoppen gesloopt en die vervangen met de arcade knop die ik momenteel gebruik.
In De Teddybeer Schuiven
Als eerste heb ik de nek van de teddybeer opengesneden, en gaatjes in de ogen van de teddybeer geboord en de 2 ledlampen in beide ogen gelijmd. Vervolgens heb ik de druk sensor in de neus gevouwen, en met de schuimvulling van de teddybeer het op zijn plek gehouden. Ook heb ik een knop in zijn arm geschoven.
De arduino uno samen met de accelerometer heb ik in een kleine kartonnen doos gedaan. De bovenkant van de doos heeft een gat waar nog wat draadjes van de arduino uitsteken omdat het anders te krap was. Als laatst heb ik een klein gaatje in de onderkant van de beer gemaakt waar de batterij in past, daar komt ook het draadje uit waar je de batterij aan vast kan maken, en vervolgens kan je de batterij in de teddybeer duwen. En als aller laatste naaide ik de beer weer dicht!
Code
html werkt niet dus moet het helaas zo:
int buzzer = 11;
int fsrAnalogPin = 0;
int fsrReading;
int buttonStatus = 0;
int LED1 = 3;
int LED2 = 5;
#include <PCM.h> (gebruik library voor het geluid)
const unsigned char turn[] PROGMEM = { (geluid word herkent)
*insert frequentie list* (hier hoort de lang lijst met frequenties te staan die iets te lang is)
{
const unsigned char au[] PROGMEM = {
*insert frequentie list*
{
const unsigned char gvd[] PROGMEM = {
*insert frequentie list*
{
const unsigned char fok[] PROGMEM = {
*insert frequentie list*
{
const unsigned char wegwezen[] PROGMEM = {
*insert frequentie list*
{
const unsigned char afblijven[] PROGMEM = {
*insert frequentie list*
{
#include <Wire.h>
int trigger = 1 ;
int ADXL345 = 0x53;
int X_out, Y_out, Z_out;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(LED1, OUTPUT); (ledlampjes)
pinMode(LED2, OUTPUT);
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(ADXL345); (accelerometer aflezen)
Wire.write(0x2D); //talk to POWER_CTL Register - 0x2D
Wire.write(8); // Bit D3 High for measuring enable (8dec -> 0000 1000 binary)
Wire.endTransmission();
delay(10);
}
void beep (){
fsrReading = analogRead(fsrAnalogPin); (aflezen druk sensor)
// Serial.print("Analog reading = ");
// Serial.println(fsrReading);
if (fsrReading > 100){
tone(buzzer, fsrReading * 2); (buzzer geluid afspelen)
}
if (fsrReading < 100){
noTone(buzzer);
}
}
Serial.println(fsrReading);
void loop() {
int sound = random(1, 50); (random getal tussen 1 - 50)
//led lampjes
int Brightness = fsrReading;
digitalWrite(LED1, fsrReading); (ledlampjes aan bij druksensor)
digitalWrite(LED2, fsrReading);
beep();
int pinValue = digitalRead(2); (button status aflezen)
delay(10);
if (buttonStatus != pinValue) {
buttonStatus = pinValue;
Serial.println(buttonStatus);
}
if (buttonStatus != 1 && 25 < sound) {
startPlayback(auw, sizeof(auw)); (geluid afspelen wanneer button ingedrukt word)
delay(1300);
}
if (buttonStatus != 1 && 25 > sound) {
startPlayback(fok, sizeof(fok)); (anderen geluid)
delay(1300);
}
Wire.beginTransmission(ADXL345);
Wire.write(0x32);
Wire.endTransmission(false);
Wire.requestFrom(ADXL345, 6, true);
if (Y_out > 30){ (zorgen dat er weer een geluidje kan worden afgespeelt als de teddy beer is omgedraaid)
trigger = 0;
}
if (Y_out < 10 && trigger < 1 && 25 > sound){
startPlayback(wegwezen, sizeof(wegwezen)); (geluid afspelen als hij omgedraait is en trigger op 1 zetten)
delay(1500);
trigger = 1;
}
if (Y_out < 10 && trigger < 1 && 25 < sound){
startPlayback(afblijven, sizeof(afblijven)); (2de geluid)
delay(1500);
trigger = 1;
}
X_out = ( Wire.read() | Wire.read() << 8);
Y_out = ( Wire.read() | Wire.read() << 8);
Z_out = ( Wire.read() | Wire.read() << 8);
Serial.print(X_out);
Serial.print(" ");
Serial.print(Y_out);
Serial.print(" ");
Serial.println(Z_out);
delay(100);
}