ремонт игрушки Ноев кавчег

pavel962
Offline
Зарегистрирован: 20.01.2018

Здравствуйте ,уважаемые форумчане

сломалась у внуков игрушка Ноев кавчег на ней 24 кнопки нажимая на которые извлекаются разные звуки корова,овца и тд.Ремонтировать решено в лоб.Ардуино+ MP3-TF-16P  по типовой схеме ,скетч взят из интернета https://www.youtube.com/watch?v=t6pdVZBE2Wg 

#include <Arduino.h>

#define BUTTON_COUNT 36
#define KEYPAD_OUTPUT_BEGIN 2
#define KEYPAD_OUTPUT_END 7
#define KEYPAD_INPUT_BEGIN 8
#define KEYPAD_INPUT_END 13



uint8_t keypad_button_pressed[BUTTON_COUNT];
volatile uint32_t ticks;
uint32_t lastTrigger, lastTriggerFrontButton;



uint8_t index = 1;
uint8_t volume = 25;

//uint8_t cmd_01[10]       = {0x7E, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x01, 0xFF, 0xE6, 0xEF};
uint8_t cmd_play_num[10] = {0x7E, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x01, 0xFF, 0xE6, 0xEF};
//uint8_t cmd_next[10]     = {0x7E, 0xFF, 0x06, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xE6, 0xEF};
uint8_t cmd_stop[10]     = {0x7E, 0xFF, 0x06, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};
uint8_t cmd_set_vol[10]  = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};


ISR(TIMER0_COMPA_vect, ISR_BLOCK) {
  ticks++;
}

void init_systicks() {

  TCCR0B = _BV(CS02) | _BV(CS00);
  TCCR0A = _BV(WGM01);
  TIMSK0 = _BV(OCIE0A);

  // 8000000/1024/78 == 100HZ -> 10 ms
  OCR0A = 77; // !!! must me set last or it will not work!
}

uint32_t math_calc_diff(uint32_t value1, uint32_t value2) {
  if (value1 == value2) {
    return 0;
  }
  if (value1 > value2) {
    return (value1 - value2);
  }
  else {
    // check for overflow
    return (0xffffffff - value2 + value1);
  }
}


void keypad_reset_output() {
  // configure pull ups
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
}

void clear_buttons() {
  for(int i=0; i < BUTTON_COUNT; i++) {
    keypad_button_pressed[i] = 0;
  }
}

void keypad_setup() {
  // initialize the digital pin as an output:
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  keypad_reset_output();

  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);

  // configure pull ups
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
}



// the loop() method runs over and over again,
// as long as the Arduino has power

void keypad_read_buttons() {
  clear_buttons();
  uint8_t y=0;
  for(int i=KEYPAD_OUTPUT_BEGIN; i <= KEYPAD_OUTPUT_END; i++) {
    keypad_reset_output();
    digitalWrite(i, LOW);
    uint8_t x=0;
    for(int j=KEYPAD_INPUT_BEGIN; j <= KEYPAD_INPUT_END; j++) {
      if (digitalRead(j) == LOW) {
        uint8_t index = x+6*y;
        keypad_button_pressed[index] = 1;
      }
      x++;
    }
    y++;
  }
}


uint8_t keypad_button_is_pressed() {
  for (int i=0; i < BUTTON_COUNT; i++) {
    if (keypad_button_pressed[i]) {
      return 1;
    }
  }
  return 0; // no button pressed
}


void send_cmd(uint8_t* cmdbuf) {
  //calc checksum (1~6 byte)
  uint16_t sum = 0;
  for (int i=1; i<7; i++) {
    sum += cmdbuf[i];
  }
  sum=-sum;
  cmdbuf[7] = sum >> 8;
  cmdbuf[8] = sum & 0xFF;
  Serial.write(cmdbuf, 10);
  /*
  for(int i=0; i < 10;i++) {
    Serial.print((char) cmd[i]);
  }*/
  // print(char*) will not work due to 0-termination
  //Serial.print((char*) cmd);
}

void play_track(uint8_t num) {
  cmd_play_num[6] = num;
  send_cmd(cmd_play_num);
}

void set_volume() {
  cmd_set_vol[6] = volume;
  send_cmd(cmd_set_vol);
}

// The setup() method runs once, when the sketch starts
void setup() {
  init_systicks();
  keypad_setup();

  // setup stop, vol down, vol up buttons
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, HIGH);


  Serial.begin(9600);
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop() {

  keypad_read_buttons();

  // allow button processing only every 300ms (30 systicks)
  if (keypad_button_is_pressed() && (math_calc_diff(ticks, lastTrigger) > 30)) {
    lastTrigger = ticks;

    for(int i=0; i < BUTTON_COUNT; i++) {
      if (keypad_button_pressed[i]) {
        play_track(i+1);
        break;
      }
    }
  }


  if (math_calc_diff(ticks, lastTriggerFrontButton) > 15) {
    lastTriggerFrontButton = ticks;
    // stop button
    if (digitalRead(A0) == LOW) {
      // send stop
      send_cmd(cmd_stop);
    }
    if (digitalRead(A1) == LOW) {
      // send vol down
      if (volume > 1) {
        volume--;
        set_volume();
      }
    }
    if (digitalRead(A2) == LOW) {
      // send vol up
      if (volume < 30) {
        volume++;
        set_volume();
      }
    }
  }
  delay(1);
}

int main(void) {

  init();
  setup();

  set_volume();
  while (true) {
    loop();
  }
}

все заработало. Но как всегда маленький нюанс,ток потребления 20-50 ма,поэтому пришлось ставить выключатель но это не спасает,забытая не выключатая игрушка ,к утру разряжает батарейки в ноль.

Помогите избавится от выключателя,на фирменной игрушке его не было.

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Чтобы избавиться от выключателя - нужно, как минимум, сдуть с ардуины 80% деталек и накидать другие 80% деталек в обвязку плеера.

bwn
Offline
Зарегистрирован: 25.08.2014

pavel962 пишет:

все заработало. Но как всегда маленький нюанс,ток потребления 20-50 ма,поэтому пришлось ставить выключатель но это не спасает,забытая не выключатая игрушка ,к утру разряжает батарейки в ноль.

Помогите избавится от выключателя,на фирменной игрушке его не было.

Переведите на литий с автоотключалкой и все проблемы. Если надо, схему найду.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так автоотключалка же всё равно подразумевает кнопку для активации?

pavel962
Offline
Зарегистрирован: 20.01.2018

очень буду благодарен за схему

pavel962
Offline
Зарегистрирован: 20.01.2018

можно потрясти есть датчик от утюга

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Так автоотключалка же всё равно подразумевает кнопку для активации?

Та и фак на нее, забыли, утром воткнули на час и играйся дальше. ИМХО.
То ТС, вот здесь. Где-то на форуме была еще ни тиньке с временными интервалами.

pavel962
Offline
Зарегистрирован: 20.01.2018

конечно буржуины мозгами заставляют игрушки работать от батареек годами,а Мы дремелем дырки под зарядки  фигагить, может одну игрушку заставим общими усилиями от двух батареек проработать не год, хотя бы месяц

bwn
Offline
Зарегистрирован: 25.08.2014

Так ктож мешает то? С чего начать вам уже написали. А дальше, мониторите нажатия, если не было пару минут, ардуинку бай, остальное обесточить.

pavel962
Offline
Зарегистрирован: 20.01.2018

Так ничего и не мешат ,понято что в сон ,а как остальное обесточить?

bwn
Offline
Зарегистрирован: 25.08.2014

Полевиком. Пока граунд, он закрыт.

pavel962
Offline
Зарегистрирован: 20.01.2018

полевиком отключаем плеер? ардуина работает?

bwn
Offline
Зарегистрирован: 25.08.2014

Ардуина сделала LOW и легла спать. Все что дальше полевика, обесточено.

pavel962
Offline
Зарегистрирован: 20.01.2018

очень вам благодарен за идею,а как конкрекно исправить скейтч?

bwn
Offline
Зарегистрирован: 25.08.2014

Вы себе противоречите #9. Управлять полевиком от A3, он вроде свободен. 

pavel962
Offline
Зарегистрирован: 20.01.2018

??

bwn
Offline
Зарегистрирован: 25.08.2014

В том посте, вы сказали: "понято что в сон" и осталась единственная, аппаратная проблема: "а как остальное обесточить?". Я рассказал Повелителю снов как это сделать, и внезапно: "а как конкрекно исправить скейтч?". Т.к. я не столь бодро управляю снами МК, ответ - мне проще слепить на кнопке, чем заняться вивисекцией этого скетча.))))

b707
Offline
Зарегистрирован: 26.05.2017

pavel962 пишет:

полевиком отключаем плеер? ардуина работает?

ардуину из этого проекта надо выкинуть - вам уже писали выше. Готовая ардуина даже во сне будет жрать эти самые 50 мА, если с нее не удалить все детали, кроме чипа и кварца.

Или проще сразу взять вместо ардуины голый чип и собрать на нем свою плату.

pavel962
Offline
Зарегистрирован: 20.01.2018

Спасибо за идею , литий,места в игрушке много,как раз без дела лежит повербанк,его и использую,потом сделаю автоотключалку .

bwn
Offline
Зарегистрирован: 25.08.2014

Если литий без защитных плат (как в телефонах), то без отключалки лучше не рискуйте. Убъете нах. Развести, вытравить, спаять, за день управитесь.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

bwn пишет:

Если литий без защитных плат (как в телефонах)

В телефонных аккумуляторах стоят платы. Контакты на аккумуляторе находятся как раз на плате, она просто стоит вверх ногами и закрыта корпусом аккумулятора.

bwn
Offline
Зарегистрирован: 25.08.2014

Jeka_M пишет:

bwn пишет:

Если литий без защитных плат (как в телефонах)

В телефонных аккумуляторах стоят платы. Контакты на аккумуляторе находятся как раз на плате, она просто стоит вверх ногами и закрыта корпусом аккумулятора.

ОК.))) Выразился неудачно, имел в виду, что во всех телефонных они есть.))))

pavel962
Offline
Зарегистрирован: 20.01.2018

В принципе у меня не ардуино а плата  ATMEGA328P Pro Mini  В ней голый проц ,кварц,стабилизатор,и два светодиода,можно удалить стаб и светики .Останется голый чип.ATMEGA328PU-CN кварц и кнопка сброса.Можно ли переделать скейтч под мои нужды,или нужно писать другую прграмму?

Сейчас запитал все это от повер банка который для зарядки телефонов дети рады!

pavel962
Offline
Зарегистрирован: 20.01.2018

Подскажите пожалуйста какой полевик лучше применить?

bwn
Offline
Зарегистрирован: 25.08.2014

pavel962 пишет:

Подскажите пожалуйста какой полевик лучше применить?

Если по моей схеме, то любой n-канальный с логик левел и на подходящий ток.