Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Подключение DFPlayer к ATmega8 - прошу проверить

Сб мар 23, 2019 10:24:27

Здравствуйте.

Мне нужно подключить DFPlayer к ATmega8. Про подключение DFPlayer к Arduino нашёл много статей и примеров, а вот как подключить его к микроконтроллеру что-то не нахожу информации. Сразу хочу сказать что работаю в Programmers Notepad [WinAVR], через Khazama AVR Programmer, загружаю с помощью USBASP совсем недавно. Поэтому боюсь сжечь :( как сам микроконтроллер, так и модуль.

Проанализировав то, что нашёл, составил схему подключения и переписал код с нескольких источников. В итоге получилось так

Изображение

main.h
Код:
#define F_CPU 8000000UL


main.c
Код:
#include <stdio.h>
#include <avr/io.h>

int current_track_number = 0;

int default_buffer[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Default Buffer
int buffer_data[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Sending Buffer

// Send Buffer to UART TX Pin
void send_buffer(void) {
    int i;
    for( i=0; i< 10; i++){
        putchar(buffer_data[i]);
        buffer_data[i] = default_buffer[i];
    }
}

// Set Volume And Send it's Serial Command
void set_volume( int volume ) {
    buffer_data[3] = 0x06;
    buffer_data[6] = volume;
    send_buffer();     
}

// Set a Track (1-3000) to Play
void play_track(int track_id) {
  buffer_data[3] = 0x03;
  if(track_id < 256) {
    buffer_data[6] = track_id;
  } else {
    buffer_data[5] = track_id / 256;
    buffer_data[6] = track_id - 256 * buffer_data[6];
  }
    send_buffer();
}

// Set a Track to Play Continuous
void play_current_track_continuous(void) {
    buffer_data[3] = 0x08;
    buffer_data[6] = current_track_number;
    send_buffer();
}

// Pause Current Playing Track
void pause_current_track(void) {
    buffer_data[3] = 0x0E;
    send_buffer();
}

int main(void)
{
  // USART initialization
  // Communication Parameters: 8 Data, 1 Stop, No Parity
  // USART Receiver: Off
  // USART Transmitter: On
  // USART Mode: Asynchronous
  // USART Baud Rate: 9600
  UCSRA=0x00;
  UCSRB=0x08;
  UCSRC=0x86;
  UBRRH=0x00;
  UBRRL=0x33;

  //
  set_volume(10);
  //
  play_track(0);
}


Правильно ли я сделал подключение, и дописал код?

Добавлено after 31 minute 25 seconds:
На схеме не стал дополнительно отображать подтяжку RESET к плюсу питания через резистор, чтобы не перегружать её соединениями.

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Сб мар 23, 2019 11:08:28

Резисторы на RX,TX не нужны.

Добавлено after 2 minutes 37 seconds:
Динамик рекомендую высокоомный. У меня при 8-омном динамике часто модуль уходит в защиту, начинает щелкать. Можно, конечно, уменьшить громкость или соответственно обработать звуковые файлы...

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Сб мар 23, 2019 11:26:15

ARV согласен, было с динамиком такое у меня на каком-то файле, когда к Arduino подключал для проверки.

Ну резисторы, вроде хуже не сделают, или могут? Просто хочу перестраховаться...

А про код сказать можете, будет работать? По моему не хватает настроек UART, слишком просто что-то. В других статьях, значительно больше инструкций по UART, разбираюсь пока медленно. Как считаете, можно попробовать записать этот код? Или нужно ещё поискать какие то исходники, чтобы проверить.

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Сб мар 23, 2019 15:12:31

Резистор не нужны.
Код, как понимаю, не будет компилироваться, т.к. нет функции putchar

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Вс мар 24, 2019 08:22:05

ARV насчёт резисторов - разве не нужно ограничить ток порта?

Про putchar эта функция вроде из stdio.h Компилируется без ошибок.

Но настройка UART
Код:
  UCSRA=0x00;
  UCSRB=0x08;
  UCSRC=0x86;
  UBRRH=0x00;
  UBRRL=0x33;


разве только это должно быть?

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Вс мар 24, 2019 15:54:38

Wireless писал(а):Компилируется без ошибок.
ну да, я ошибся: компилироваться будет, работать не будет
Код:
#define putchar(__c) \
   fputc(__c, stdout)
вот так определена эта "функция" в avr-libc
поскольку у вас нет сопоставления stdout с USART, соответственно, в результате ничего не выйдет.


что там должно бытть с настройками USART я не очень знаю, потому как магические числа расшифровывать по памяти не умею, и желания ковыряться в даташитах тоже нет. могу рекомендовать мой модуль com_io, добавив который в свой проект вы автоматически получите работоспособный вывод в stdout, то есть вместо всей этой вашей самодеятльности сможете просто применять printf для вывода в ваш mp3-плейер (если, конечно, не с attiny2313 работаете - printf память жрет).

Код:
/** \file com_io.h
 * \brief Заголовочный файл библиотеки ввода-вывода для USART
 *
 * \author ARV
 * \date   05.02.2009
 * \version 1.0 beta
 * \copyright 2008 © ARV
 * Для компиляции требуется:\n
 *    -# WinAVR-20080411 или более новая версия
 *
 */

#ifndef COM_IO_H_
#define COM_IO_H_

#include <stdio.h>

/// Если не используется WDT, эту опцию установить в ноль
#define USE_WDT 0

/// Если ввод не требуется, эту опцию надо установить в единичку
#define ONLY_OUT 1

/// Скорость обмена по USART
#define BAUD 38400UL

#endif /* COM_IO_H_ */


Код:
/** \file com_io.c
 * \brief Библиотека ввода-вывода для USART
 *
 * Реализует "интерфейс по умолчанию" для функций printf() и т.п.
 * По умлочанию устанавливаетя скорость, задаваемая макросом #BAUD
 * \author ARV
 * \date   05.02.2009 ...
 * \version 1.0 beta
 * \copyright 2008 © ARV
 * Для компиляции требуется:\n
 *    -# WinAVR-20080411 или более новая версия
 *
 */
#include <avr/io.h>
#include <avr/wdt.h>
#include "com_io.h"
#include <stdio.h>

/// Выводит символ
static int uart_putchar(char c, FILE *stream);
#if ONLY_OUT == 0
static int uart_getchar(FILE *stream);
#endif

/// Структура устройства ввода-вывода
#if ONLY_OUT != 0
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
#else
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
#endif

/** Вывод одного символа с переводом строки при необходимости (локальная функция)
 *
 * @param c выводимый символ
 * @param stream поток для вывода
 * @return всегда возвращает 0
 */
static int uart_putchar(char c, FILE *stream){
  if (c == '\n')
   uart_putchar('\r', stream);
  while(bit_is_clear(UCSR0A, UDRE0))
#if USE_WDT != 0
     wdt_reset();
#endif
  ;
  UDR = c;
  return 0;
}

#if ONLY_OUT == 0
static int uart_getchar(FILE *stream){
   while(bit_is_clear(UCSRA, RXC))
#if USE_WDT != 0
     wdt_reset();
#endif
   ;
   return UDR;
}
#endif


/** Автоматическая инициализация модуля.
 * Вызывать из основного модуля эту функцию не нужно.
 */
/// Функция настройки параметров USART и инициализации ввода-вывода.
static void __attribute__((naked, used, section(".init7"))) stdio_init(void){
   
   UCSRA = 0;
#include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
#if USE_2X
   UCSRA |= (1 << U2X);
#else
   UCSRA &= ~(1 << U2X);
#endif
   UCSRB |= _BV(TXEN);
#if ONLY_OUT == 0
   UCSRB |= _BV(RXEN);
#endif
   UCSRC = 0x86;

   stdout = &mystdout;
   stdin = stdout;
}



в com_io.h настраиваете требуемые параметры, ориентируясь по комментам
com_io.h инклюдите в любой модуль, где нужен ввод-вывод.
com_io.c добавляете в список компилируемых файлов проекта.
компилируете, наслаждаетесь.

Код:
#include "com_io.h"

int main(void){
   printf("\nHello, world!");
}
если вы подключили к своему МК терминал, то в нем увидите результат.

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Пн мар 25, 2019 13:22:34

ARV да, я вот про это и думал

Код:
FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &mystdout;


когда про настройки USART имел ввиду. Теперь, с Вашей помощью я понял, что я прав :) Спасибо Вам.

Теперь всё же остается вопрос про резисторы:

В документации модуля http://www.picaxe.com/docs/spe033.pdf
Module's serial port is 3.3V TTL level, so the default interface level is 3.3V. If the MCU system is 5V. It
is recommended connect a 1K resistor in series.


Правильно ли я понимаю что USART у меня от 2 батареек не будет работать, значит напряжение нужно уже 4.5 вольт, я не видел настроек для понижения регистром, получается я могу только подключить резистор на 1 кОм?

Re: Подключение DFPlayer к ATmega8 - прошу проверить

Пн мар 25, 2019 15:20:08

У вас на схеме и модуль, и МК имеют общее питание, поэтому никаких резистров не надо.
В даташите описан случай, когда питания РАЗНЫЕ.
Ответить