Author Topic: Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)  (Read 3500 times)

g4lile0

  • Newbie
  • *
  • Posts: 2
  • Country: es
Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)

Here you have a robot that a designed inspired by Bob and Zowi with bluetooth functionality to be controlled from an Android phone and use a Monteino.





Here you have some videos:



The source code (3d parts and arduino code) to make Bobwi dance, or to be controlled from Android.

https://github.com/G4lile0
http://www.thingiverse.com/thing:1274838

Regarding the code, I just create the code to make the bluetooth module compatible with the Android app, and adapted the original code to be compatible with the pinout of the monteino, is still a Work in Progress..


joelucid

  • Hero Member
  • *****
  • Posts: 869
Re: Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)
« Reply #1 on: March 13, 2016, 06:07:49 PM »
This absolutely made my day! Thanks for posting.

TomWS

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1837
Re: Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)
« Reply #2 on: March 13, 2016, 09:27:17 PM »
This absolutely made my day! Thanks for posting.
Two questions, Joe:
1. Can you do that with a coin cell battery?
2. Can you do that?    ;D   I'm pretty sure Felix can.  Of course he's younger than... well, no comment.

Tom

Felix

  • Administrator
  • Hero Member
  • *****
  • Posts: 5630
  • Country: us
    • LowPowerLab
Re: Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)
« Reply #3 on: March 13, 2016, 10:52:52 PM »
Haha! This is so brilliant :)

2. Can you do that?    ;D   I'm pretty sure Felix can.  Of course he's younger than... well, no comment.
Tom
Tom - I'm pretty sure I can't ;)

g4lile0

  • Newbie
  • *
  • Posts: 2
  • Country: es
Re: Bobwi - Cheap, easy to print, walking and dancing robot. (with BT)
« Reply #4 on: April 04, 2016, 05:39:16 PM »
Hi,

Just an update, the orginal Zowi, have a 5 x 6 px LED matrix, and I would like to give this feature to Bobwi.



https://github.com/bq/zowi/tree/master/Zowi_mold/hardware/Zowi%20Led%20Matrix/PDF


Original.
Code: [Select]
/******************************************************************************
* Zowi LED Matrix Library
*
* @version 20150710
* @author Raul de Pablos Martin
*         Josť Alberca Pita-Romero (Mouth's definitions)
******************************************************************************/

#include "LedMatrix.h"

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

LedMatrix::LedMatrix(char ser_pin, char clk_pin, char rck_pin) {
memory = 0x00000000;
SER = ser_pin;
CLK = clk_pin;
RCK = rck_pin;
pinMode(SER, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(RCK, OUTPUT);
digitalWrite(SER, LOW);
digitalWrite(CLK, LOW);
digitalWrite(RCK, LOW);
sendMemory();
}

void LedMatrix::writeFull(unsigned long value) {
memory = value;
sendMemory();
}

unsigned long LedMatrix::readFull(void) {
return memory;
}

void LedMatrix::setLed(char row, char column) {
if(row >= 1 && row <= ROWS && column >= 1 && column <= COLUMNS) {
memory |= (1L << (MATRIX_LENGTH - (row-1)*COLUMNS - (column)));
sendMemory();
}
}

void LedMatrix::unsetLed(char row, char column) {
if(row >= 1 && row <= ROWS && column >= 1 && column <= COLUMNS) {
memory &= ~(1L << (MATRIX_LENGTH - (row-1)*COLUMNS - (column)));
sendMemory();
}
}

void LedMatrix::clearMatrix(void) {
memory = 0x00000000;
sendMemory();
}

void LedMatrix::setEntireMatrix(void) {
memory = 0x3FFFFFFF;
sendMemory();
}

void LedMatrix::sendMemory(void) {
int i;

for(i = 0; i < MATRIX_LENGTH; i++) {
digitalWrite(SER, 1L & (memory >> i));
// ## adjust this delay to match with 74HC595 timing
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
digitalWrite(CLK, 1);
// ## adjust this delay to match with 74HC595 timing
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
digitalWrite(CLK, 0);
}

digitalWrite(RCK, 1);
// ## adjust this delay to match with 74HC595 timing
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
digitalWrite(RCK, 0);
}


I just adapted the original code that work with 74HC595 to a I2C mini 0,8'' white led matrix 8x8 from adafruit.

This is a test script.

Code: [Select]
    #define BRIGHTNESS   6 // 0=min, 15=max
    #define I2C_ADDR   0x70 // Edit if backpack A0/A1 jumpers set

    #include <Wire.h>
    unsigned long memory;
    static const uint8_t PROGMEM reorder[] = { // Column-reordering table
        0x00,0x40,0x20,0x60,0x10,0x50,0x30,0x70,0x08,0x48,0x28,0x68,0x18,0x58,0x38,0x78,
        0x04,0x44,0x24,0x64,0x14,0x54,0x34,0x74,0x0c,0x4c,0x2c,0x6c,0x1c,0x5c,0x3c,0x7c,
        0x02,0x42,0x22,0x62,0x12,0x52,0x32,0x72,0x0a,0x4a,0x2a,0x6a,0x1a,0x5a,0x3a,0x7a,
        0x06,0x46,0x26,0x66,0x16,0x56,0x36,0x76,0x0e,0x4e,0x2e,0x6e,0x1e,0x5e,0x3e,0x7e,
        0x01,0x41,0x21,0x61,0x11,0x51,0x31,0x71,0x09,0x49,0x29,0x69,0x19,0x59,0x39,0x79,
        0x05,0x45,0x25,0x65,0x15,0x55,0x35,0x75,0x0d,0x4d,0x2d,0x6d,0x1d,0x5d,0x3d,0x7d,
        0x03,0x43,0x23,0x63,0x13,0x53,0x33,0x73,0x0b,0x4b,0x2b,0x6b,0x1b,0x5b,0x3b,0x7b,
        0x07,0x47,0x27,0x67,0x17,0x57,0x37,0x77,0x0f,0x4f,0x2f,0x6f,0x1f,0x5f,0x3f,0x7f,
        0x80,0xc0,0xa0,0xe0,0x90,0xd0,0xb0,0xf0,0x88,0xc8,0xa8,0xe8,0x98,0xd8,0xb8,0xf8,
        0x84,0xc4,0xa4,0xe4,0x94,0xd4,0xb4,0xf4,0x8c,0xcc,0xac,0xec,0x9c,0xdc,0xbc,0xfc,
        0x82,0xc2,0xa2,0xe2,0x92,0xd2,0xb2,0xf2,0x8a,0xca,0xaa,0xea,0x9a,0xda,0xba,0xfa,
        0x86,0xc6,0xa6,0xe6,0x96,0xd6,0xb6,0xf6,0x8e,0xce,0xae,0xee,0x9e,0xde,0xbe,0xfe,
        0x81,0xc1,0xa1,0xe1,0x91,0xd1,0xb1,0xf1,0x89,0xc9,0xa9,0xe9,0x99,0xd9,0xb9,0xf9,
        0x85,0xc5,0xa5,0xe5,0x95,0xd5,0xb5,0xf5,0x8d,0xcd,0xad,0xed,0x9d,0xdd,0xbd,0xfd,
        0x83,0xc3,0xa3,0xe3,0x93,0xd3,0xb3,0xf3,0x8b,0xcb,0xab,0xeb,0x9b,0xdb,0xbb,0xfb,
        0x87,0xc7,0xa7,0xe7,0x97,0xd7,0xb7,0xf7,0x8f,0xcf,0xaf,0xef,0x9f,0xdf,0xbf,0xff };

    void ledCmd(uint8_t x) { // Issue command to LED backback driver
      Wire.beginTransmission(I2C_ADDR);
      Wire.write(x);
      Wire.endTransmission();
    }

    void clear(void) { // Clear display buffer
      Wire.beginTransmission(I2C_ADDR);
      for(uint8_t i=0; i<17; i++) Wire.write(0);
      Wire.endTransmission();
    }

    void setup() {
      Wire.begin();              // I2C init
      clear();                   // Blank display
      ledCmd(0x21);              // Turn on oscillator
      ledCmd(0xE0 | BRIGHTNESS); // Set brightness
      ledCmd(0x81);              // Display on, no blink
    }

// samples of mouths
//#define zero_code                  0b00001100010010010010010010001100
//#define tongueOut_code             0b00111111001001001001000110000000
//#define xMouth_code                0b00100001010010001100010010100001
#define heart_code                 0b00010010101101100001010010001100
//#define nine_code                  0b00001100010010001110000010001110
    void loop() {
    clear();
    delay(500);
          memory = heart_code <<1;
          Wire.beginTransmission(I2C_ADDR);
          Wire.write(0);
          Wire.write(pgm_read_byte(&reorder[0B00000000]));
          Wire.write(0);
          for(uint8_t j=0; j<5; j++) {
          Wire.write(pgm_read_byte(&reorder[(memory >> (24-j*6)  ) & 0B01111110]));
          Wire.write(0);
          }
          Wire.write(pgm_read_byte(&reorder[0B00000000]));
          Wire.write(0);
          Wire.write(pgm_read_byte(&reorder[0B00000000]));
          Wire.write(0);
          Wire.endTransmission();
    delay(1000);

    clear();
    delay(500);
     
    }

Everything run fine, with the "test script".. but when I tried to modify the library :( it doesn't work...
I doesn't have experience with libraries, so sure that I missing something...

I'll keep you updated.