Akno

"Step into a realm of enchanting robotics with Akno, the Arduino Mega 2560-powered wonder. Immerse yourself in the captivating fusion of technology and cuteness as Akno, your very own charming robot companion, comes to life. Designed with love and ingenuity, Akno showcases the magic of DIY robotics, inviting you to explore its delightful interactions and endearing personality. Embrace the future with Akno and experience innovation through the lens of adorable companionship.”

Oct 29, 2023
"Delve into the world of innovative DIY robotics with the mesmerizing Akno project. Crafted using the Arduino Mega 2560 platform, this project is a testament to creativity and technical prowess. Akno, an embodiment of cuteness and ingenuity, brings together art and engineering in a seamless fusion. Explore the meticulous process of designing, assembling, and programming Akno, and witness how simple components can be transformed into a captivating robotic companion. From its expressive interactions to its charming aesthetics, the Akno project exemplifies the endless possibilities when imagination meets technology. Join us in unraveling the journey of creating a lovable robot that not only sparks joy but also inspires the tinkerer in all of us.”

Components

the components used are:
  1. Motherboard/brain:- Arduino Mega 2560
  1. voice recognition Module
  1. St7920 LCD display : 128*64
  1. L293D motor drivers
  1. Analog Push buttons
  1. Microphone for giving commands
  1. LED

About the project

AKNO is a smart, kind, and cute robot made with love and wires.
By Moksh Gupta
Akno is a smart robot with voice recognition and facial expressions. It reacts with voice commands with 25 voice command and it has 15 different facial expression on 128*64 lcd display via SPI, and the main AKNO'S brain is the Arduino MEGA 2560 Powered by two 18650 3.7v 2000mAh batteries. With two common Anode RGB LEDs one in the front and one in the back of the robot, with 3 push buttons for a varies functionalities. /**/
===========================================
/Features/ Akno support's more than 250 voice command (25 of them is already in use at that version)
15 different facial expression with smoth animation (happy, sad, angry, upset, normal, cute, suspicious, iam, youmademe, wonder, downeye, righteye, lefteye, upeye, blink) plus two RGB LEDs effects.
6 different moving pattern (right, left, forward, backward, spinning, doproblems)
Akno support's game mode (PongGame) you can play with him.
You can add more features if you're familiar with c/c++. /**/
===========================================
/* NOTICE CAREFULLY*/ Please notice all buttons connected to analog pin with resistors, so you should consider that if you want to change the buttons into digital pin.
All enable pins of the motor driver which (l293d) ic at high state, or you can just attach it to 5v.
I used common Anode RGB LEDs at this version of AKNO, so if you want to use common Cathode LEDs you should make changes at : expressions.h/(line:250&line:262)/(LED1&LED2) functions by Just deactivate the marked three lines. /**/
===========================================
This is the the worst code I've ever written, but it works :)

Circuit Diagrams

1️⃣
ANALOG PUSH BUTTON
notion image
 
2️⃣
ST7920 LCD DISPLAY
notion image
3️⃣
L293D MOTOR DRIVERS
notion image
 
4️⃣
VOICE RECOG MODULE
notion image
As it is given in each circuit diagram, to what Arduino pin the module pin is to be connected
It would be easier for you to assemble the Akno bot, connect a Microphone to the voice recognition module.

Akno.ino

#include "VoiceRecognitionV3.h" #include "definitions.h" #include "PongGame.h" #include "voice_commands.h" #include "moves.h" #include "reactions.h" // Voice Recognition pins connection VR myvr(10, 11); // Rx => 11, Tx => 10 // 10 11 uint8_t records[7]; uint8_t buf[64]; void ponggame(); void setup() { Serial.begin(115200); myvr.begin(9600); myvr.setIOMode(3); attachInterrupt(digitalPinToInterrupt(interruptPin), listening, RISING); defState(); load_main_commands(); u8g2.begin(); u8g2.clearBuffer(); LED1(0, 155, 255); LED2(100, 255, 0); close(); delay(600); // 600 normal(); delay(200); // 200 close(); delay(150); // 150 normal(); delay(400); // 400 hanging(); skip = 1; } void loop() { LED1(0, 155, 255); LED2(100, 255, 0); CurrentTime1 = millis(); CurrentTime2 = millis(); CurrentTime3 = millis(); u8g2.clearBuffer(); stop(); skip = 1; recognizing = myvr.recognize(buf, 50); // when voice active is true reset IO pins of the voice recognition module to make a custom pulse if(VoiceActive == true) { myvr.resetIO(0); VoiceActive = false; } // random actions every 4 seconds if((CurrentTime3-PrevTime3) > 5000) { hanging(); PrevTime3=CurrentTime3; } if(counter == 150) { counter = 180; } // upset when long time passes if(counter > 150) { upset(); counter -= 1; if(counter == 150) { counter = 0; } } // blink when not upset (normal mode) else { blink(); q = -15; counter++; Serial.println(analogRead(A8)); } // Enter voice training mode if (select&up)or(select&down) button is pressed at the se time if(comp(buttonvalue[3])||comp(buttonvalue[4])||voicetraining_command){ train_voice(); voicetraining_command=false; close(); delay(600); // 600 normal(); delay(200); // 200 close(); delay(150); // 150 normal(); delay(400); // 400 hanging(); } handshake();// check if hand is shaked // check if there's voice command active if(recognizing > 0) { // skip variable is to make all delay =0 when voice command is comming, and let the delay normal when voice command is not active skip = 1; switch(buf[1]) { case heyakno: heyakno_reaction(); if(!firstlist) { myvr.clear(); load_main_commands(); } break; case youknowwhat: youknowwhat_reaction(); if(!seclist) { myvr.clear(); load_chatting_commands(); } break; case gotoo: goto_reaction(); if(!thirdlist) { myvr.clear(); load_moving_commands(); } break; case youarestupid: youarestupid_reaction(); break; case partytime: partytime_reaction(); break; case goright: goright_reaction(); break; case goleft: goleft_reaction(); break; case gobackward: gobackward_reaction(); break; case nicewheels: nicewheels_reaction(); break; case letsplay: letsplay_reaction(); break; case doproblems: doproblems_reaction(); break; case whoareyou: whoareyou_reaction(); break; case iloveyou: iloveyou_reaction(); break; case ihateyou: ihateyou_reaction(); break; case imsorry: imsorry_reaction(); break; case crazy: crazy_reaction(); break; case goforward: goforward_reaction(); break; case spining: spining_reaction(); break; case expressions: expressions_reaction(); break; case battreylevel: battreylevel_reaction(); break; case colortest: colortest_reaction(); break; case voicetraining: voicetraining_reaction(); break; case testmotors: testmotors_reaction(); break; case testbuttons: testbuttons_reaction(); break; case showsetting: showsettings_reaction(); if(!fourthlist) { myvr.clear(); load_settings_commands(); } break; default: break; } } } // interrupting when voice command is comming void listening() { skip = 0;// make skip 0 to make delay(x*skip) =0 too VoiceActive = true; } // load first list. max 7 command active at the same time. void load_main_commands() { myvr.load(uint8_t(heyakno)); // hey acno myvr.load(uint8_t(youknowwhat)); // go myvr.load(uint8_t(gotoo)); // right myvr.load(uint8_t(letsplay)); // turn myvr.load(uint8_t(whoareyou)); // dance myvr.load(uint8_t(showsetting)); // left myvr.load(uint8_t(iloveyou)); // back firstlist = true; seclist = false; thirdlist = false; fourthlist = false; } // load the second list. max 7 command active at the same time. void load_chatting_commands() { myvr.load(uint8_t(heyakno)); myvr.load(uint8_t(ihateyou)); myvr.load(uint8_t(youarestupid)); myvr.load(uint8_t(imsorry)); myvr.load(uint8_t(nicewheels)); myvr.load(uint8_t(crazy)); myvr.load(uint8_t(partytime)); firstlist = false; seclist = true; thirdlist = false; fourthlist = false; } void load_moving_commands() { myvr.load(uint8_t(heyakno)); myvr.load(uint8_t(goright)); myvr.load(uint8_t(goleft)); myvr.load(uint8_t(goforward)); myvr.load(uint8_t(gobackward)); myvr.load(uint8_t(spining)); myvr.load(uint8_t(doproblems)); firstlist = false; seclist = false; thirdlist = true; fourthlist = false; } void load_settings_commands() { myvr.load(uint8_t(heyakno)); myvr.load(uint8_t(expressions)); myvr.load(uint8_t(battreylevel)); myvr.load(uint8_t(colortest)); myvr.load(uint8_t(voicetraining)); myvr.load(uint8_t(testmotors)); myvr.load(uint8_t(testbuttons)); firstlist = false; seclist = false; thirdlist = false; fourthlist = true; } void train_voice() { int visibility =1; bool blink_ok = false; // Categorie commands selecting menu while(1){ u8g2.setDrawColor(1); CurrentTime1 = millis(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_helvB08_tf); u8g2.drawFrame(0,0,128,64); u8g2.drawStr(15, 12, "Select the Categorie"); u8g2.drawHLine(5, 17, 118); u8g2.drawStr(5, 37, categories[categorie_num]); u8g2.drawButtonUTF8(110, 59, U8G2_BTN_INV, 0, 2, 2, "OK"); u8g2.sendBuffer(); if(comp(buttonvalue[0])){ categorie_num++; delay(200); } if(comp(buttonvalue[1])){ categorie_num--; delay(200); } if(comp(buttonvalue[2])&&((CurrentTime1-PrevTime1) > 1100)&&(categorie_num<4)){ PrevTime1=CurrentTime1; // Command selecting menu while(1) { CurrentTime1 = millis(); u8g2.clearBuffer(); u8g2.drawFrame(0,0,128,64); u8g2.setFont(u8g2_font_helvB08_tf); u8g2.drawStr(16, 12, categories[categorie_num] ); u8g2.drawHLine(5, 16, 118); u8g2.drawStr(23, 28, "Select Command"); u8g2.drawButtonUTF8(110, 59, U8G2_BTN_INV, 0, 2, 2, "OK" ); u8g2.drawStr(5, 45, commands[command_num]); u8g2.drawStr(110, 45, numbers[command_num]); u8g2.sendBuffer(); if(comp(buttonvalue[2])&&((CurrentTime1-PrevTime1) > 800)){ PrevTime1=CurrentTime1; // training instruction menu while(1) { CurrentTime1 = millis(); u8g2.clearBuffer(); u8g2.drawFrame(0,0,128,64); u8g2.setFont(u8g2_font_helvB08_tf); u8g2.drawStr(5, 10, "Start speak when the" ); u8g2.drawStr(5, 21, "light turned red and"); u8g2.drawStr(5, 33, "stop when it doesn't"); u8g2.setDrawColor(visibility); u8g2.drawButtonUTF8(110, 59, U8G2_BTN_INV, 0, 2, 2, "OK" ); u8g2.setDrawColor(1); u8g2.drawHLine(5, 37, 118); u8g2.drawStr(5, 48, commands[command_num]); u8g2.drawStr(105, 48, numbers[command_num]); u8g2.sendBuffer(); // exit if(comp(buttonvalue[2])&&((CurrentTime1-PrevTime1) > 400)&&blink_ok){ PrevTime1=CurrentTime1; blink_ok=false; break; } // blinking OK if((CurrentTime1-PrevTime1)>700){ visibility<1?visibility++:visibility--; PrevTime1=CurrentTime1; blink_ok = true; } } // start listening and train train_state = myvr.train(command_num, buf); PrevTime1=CurrentTime1; } // trained successed message while(train_state==3){ CurrentTime1 = millis(); u8g2.clearBuffer(); u8g2.drawFrame(0,0,128,64); u8g2.setFont(u8g2_font_helvB08_tf); u8g2.drawStr(28, 12, "Training Done!" ); u8g2.drawStr(5, 32,commands[command_num]); u8g2.drawStr(110, 32,numbers[command_num]); u8g2.drawButtonUTF8(110, 59, U8G2_BTN_INV, 0, 2, 2, "OK" ); u8g2.sendBuffer(); // exit if(comp(buttonvalue[2])&&((CurrentTime1-PrevTime1) > 800)){ train_state=0; PrevTime1=CurrentTime1; } } // end of train success message if(comp(buttonvalue[0])){ command_num++; delay(250); } if(comp(buttonvalue[1])){ command_num--; delay(250); } if((comp(buttonvalue[3])||comp(buttonvalue[4]))&&((CurrentTime1-PrevTime1) > 1000)){ PrevTime1=CurrentTime1; break; } if(command_num>uprange[categorie_num]){ command_num=downrange[categorie_num]; } if(command_num<downrange[categorie_num]){ command_num=uprange[categorie_num]; } }//end while delay(300); } // endif else if(comp(buttonvalue[2])&&(categorie_num==4)&&((CurrentTime1-PrevTime1) > 1000)){ while(1){ CurrentTime1 = millis(); info(); if((comp(buttonvalue[3])||comp(buttonvalue[4]))&&((CurrentTime1-PrevTime1) > 1000)){ PrevTime1=CurrentTime1; break; } } } if((comp(buttonvalue[3])||comp(buttonvalue[4]))&&((CurrentTime1-PrevTime1) > 1000)){ PrevTime1=CurrentTime1; myvr.clear(); load_main_commands(); break; } if(categorie_num>categorie_item-1){ categorie_num=0; } if(categorie_num<0) { categorie_num=categorie_item-1; } } } void info(){ u8g2.clearBuffer(); u8g2.drawFrame(0,0,128,64); u8g2.setFont(u8g2_font_helvB08_tf); u8g2.drawStr(42, 12, "Akno Bot" ); u8g2.drawHLine(5, 14, 118); u8g2.drawButtonUTF8(109, 59, U8G2_BTN_INV, 0, 2, 2, "==>" ); switch(next_page){ case 0: u8g2.drawStr(3, 26, "Software Version 1.1"); u8g2.drawStr(3, 38, "By Moksh Gupta "); u8g2.drawStr(3, 50, "Vist my github page"); u8g2.sendBuffer(); break; case 1: u8g2.drawStr(3, 26,"for checking updates :"); u8g2.drawStr(2, 40, "github/moksh5936"); u8g2.drawStr(3, 53, "/Akno"); u8g2.sendBuffer(); break; } if(comp(buttonvalue[2])){ next_page>0?next_page=0:next_page++; delay(400); } }
There are some libraries to be imported in Arduino ide those are in the project file those exist in the form of header file( .h )

PROJECT FILES

project inspired by Emo
Another project video I took from yt as reference - ultrasonic radar
Codes-