Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ардуино - запись звука

Чт янв 12, 2023 19:30:06

это типа шутка такая ?))
https://www.radiokot.ru/forum/viewtopic ... 8&t=185219

https://www.radiokot.ru/forum/download/ ... ?id=314658
https://www.radiokot.ru/forum/download/ ... ?id=315796
https://www.radiokot.ru/forum/download/ ... ?id=315797
https://www.radiokot.ru/forum/download/ ... ?id=314856
... и т.д.

W5500 во всех режимах...
macraw_W5500.c
(13.96 KiB) Скачиваний: 48

udp_W5500.c
(17.1 KiB) Скачиваний: 44

tcp_W5500.c
(16.77 KiB) Скачиваний: 40

... и т.д.

тебе надо или macraw_W5500 или udp_W5500.
я использую macraw_W5500 (он работает медленней... но мне большая скорость пока не нужна).
для записи звука лучше udp_W5500 (будет быстрей).

Добавлено after 3 hours 54 minutes 38 seconds:
схему рисуй)) как ты будешь подключать к ардуине...
у тебя же вроде ардуина ? или нет ? у меня нет))
схема.jpg
(35.4 KiB) Скачиваний: 55

W5500 работает по SPI... это хорошо)) SPI быстрый ))
ещё можно прогнать всё в Протеусе.
:tea:

Re: Ардуино - запись звука

Вт янв 17, 2023 10:17:24

и где наш звук ?))
:tea:
немного подкрутили скайп)) улучшили защиту... и т.д.
чето мой W5500 начал глючить... надо разбираться.
ты со своими модулями уже разобрался ?
:tea:

Re: Ардуино - запись звука

Ср янв 18, 2023 18:00:28

с модулями не разобрался, вот сегодня пришел второй модуль в который Нана Вставляется

Но у меня есть очень важная Инфа. Я домучил передачу UDP c VLC на VLC

Что бы на постоянке гнать сигнал с компа по UDP через VLC установил Virtual Audio Cable и на передающем компе запустил код:
vlc.exe dshow:// :dshow-vdev="none" :dshow-adev="CABLE Output (VB-Audio Virtual Cable)" --sout=#transcode{acodec="u8 ",channels=1,samplerate=8000,ab=128}:duplicate{dst=std{access=udp,mux=raw,dst=192.168.0.64:4210}}

на приемном компе настроил прием этим кодом:
vlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=8000 --rawaud-fourcc "u8 " udp://@:4210

Интересен вывод:
Если гоняю пакеты по LAN и по wifi все отлично - никаких прерыванний
в кодах настройки никаких кэширований не предусматривал.

Добавлено after 8 minutes 53 seconds:
Ваш ява-приемник тоже прекрасно принимает поток безо всяких дефектов, ровно , чисто

Мой андроид приемник принимает вроде как ровно, но идет какой-то периодический артефакт в виде щелчков каждый 0.3-0.5 сек

Re: Ардуино - запись звука

Чт янв 19, 2023 00:34:51

так и не понял зачем нужен VLC... ну да ладно))
мне нужен самодельный мессенджер.
:tea:

Добавлено after 9 minutes 51 second:
olegue писал(а):Мой андроид приемник принимает вроде как ровно, но идет какой-то периодический артефакт в виде щелчков каждый 0.3-0.5 сек

ява-приемник прекрасно принимает поток безо всяких дефектов, ровно , чисто... потому что:
1. есть буфер сокета
2. после команды RX_line.start(); ява-приемник воспроизводит из буфера непрерывно...
до тех пор пока не отправишь команду RX_line.stop(); и RX_line.close();

похоже твой андроид приемник... тормозит))
а может сокет тормозит...

говорю же... надо отдельно проверить работу андроид плеера и сокета.
:tea:

Код:
int buffersize = AudioRecord.getMinBufferSize(11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

           AudioRecord arec = new AudioRecord(
                    MediaRecorder.AudioSource.MIC, 11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, buffersize);

            byte[] buffer = new byte[buffersize];
            arec.startRecording();
         //arec.read(buffer, 0, buffersize);

что то мне ту не нравится...
:roll:
а где полный код ?

Код:
public void RecvAudio()

{
    Thread thrd = new Thread(new Runnable() {
      @Override
        public void run()
        {
            Log.e(LOG_TAG, "start2 recv thread, thread id: "
                + Thread.currentThread().getId());
   
            AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
                    SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_8BIT, BUF_SIZE,
                    AudioTrack.MODE_STREAM);
            track.play();
            DatagramSocket sock = null;
   

            try
            {
                sock = new DatagramSocket(AUDIO_PORT);
                byte[] buf = new byte[BUF_SIZE];
   
                while(Server_aktiv)
                {
                    DatagramPacket pack = new DatagramPacket(buf, BUF_SIZE);
                    sock.receive(pack);
                    Log.d(LOG_TAG, "recv pack: " + pack.getLength());
                    buf=pack.getData();
                    //track.write(pack.getData(), 0, pack.getLength());
                  track.write(buf, 0, buf.length);
                }
            }
            catch (SocketException se)
            {
                Log.e(LOG_TAG, "SocketException: " + se.toString());
            }
            catch (IOException ie)
            {
                Log.e(LOG_TAG, "IOException" + ie.toString());
            }
           
            finally
            {
              if (sock != null)
              {
                 sock.close();
                   Toast toast = Toast.makeText(getApplicationContext(),
                       "Сервер UDP остановлен. Пора покормить кота!", Toast.LENGTH_SHORT);
                    toast.show();
              }
            }
        } // end run
    });
    thrd.start();
}

Re: Ардуино - запись звука

Чт янв 19, 2023 20:08:10

обнаружен новый эффект))
W5500 + ATmega328... работает... работает... потом бац ! и программа ATmega328 зависла в одном месте... когда ATmega328 передаёт длинные последовательности байт по SPI :shock:
всё указывает на глюк аппаратного SPI...
:o
вообще подобное уже наблюдалось с W5100 + ATmega128 которые мы запускали в другой теме...
там было ещё хуже))
SPI в ATmega128 глючило вообще со страшной силой)) при этом W5100 даже не успевала инициализироваться как SPI зависал...
причём SPI глючил только после подключения W5100...
:dont_know:
со всякими радио модулями и экранами и т.д. SPI работала нормально ))
что мы только не подключали к бедной ATmega128 по SPI... SPI работала нормально ))
пульт.jpg
(150.91 KiB) Скачиваний: 41

а вот с W5100 SPI работать отказывается))
там нас спасал сторожевой таймер))
но постоянно перезагружать МК... это не выход...
:?
в чём причина... уже не помню.. так и не разобрались))
просто заменили ATmega128 на ATmega328 и вроде всё заработало...
но не долго)) глюки никуда не ушли...
короче... надо искать причину.
:tea:

Добавлено after 4 hours 13 minutes 46 seconds:
что-то странное происходит с моей ATmega328... при подключении W5500 зависает...
:shock:

Re: Ардуино - запись звука

Пт янв 20, 2023 17:58:39

ошибка программы... исправил))
:tea:
где наш звук ?))

Re: Ардуино - запись звука

Пт фев 10, 2023 21:47:44

Все оборудование пришло, осталось сделать над собой усилие что бы начать. Но пока не получается.

Re: Ардуино - запись звука

Сб фев 11, 2023 00:12:55

:)))
начни с простого... нарисуй схему))
ATmega328-Server.rar
(38.59 KiB) Скачиваний: 54

Re: Ардуино - запись звука

Ср авг 02, 2023 08:56:42

udp over tcp. У кого есть опыт. Хочется прокинуть пакеты на любой ip, а не только на белый

Re: Ардуино - запись звука

Ср авг 02, 2023 19:25:40

udp over tcp - что это значит ?))

а как прокинуть пакеты на любой ip ?
:roll:
я знаю только один способ это сделать - нужен сервер с белым ip
и тогда куча клиентов могут перекидываться пакетами через сервер...
Screenshot_1.jpg
(57.91 KiB) Скачиваний: 33

именно так работают все мессенджеры.

udp VS tcp - это уже вопрос десятый))

Re: Ардуино - запись звука

Ср авг 02, 2023 21:01:14

ну ок, есть сервер с белым Ip, например скейчас я на нем и экспериментирую. Как будет выглядеть перегидывавание пакетов на клиентов?

Re: Ардуино - запись звука

Ср авг 02, 2023 23:30:32

перекидывавание пакетов на клиентов... везде одинаковое))

1. первый клиент подключается к серверу и удерживает соединение открытым постоянно.
2. второй клиент тоже подключается к серверу и удерживает соединение открытым постоянно.
3. если первый клиент хочет передать пакет второму клиенту то он просто инкапсулирует пакет с указанием IP второго клиента и передаёт серверу.
4. сервер смотрит какой IP внутри пакета и передаёт второму клиенту.
Всё))

в данном случае сервер работает как обычный ретранслятор пакетов))

точно так же например работает VPN...

Например мне тут стало интересно как работает мой умный дом по VPN. Скачал оперу... В опере есть бесплатный встроенный VPN.
1-Мой комп 192.168.0.101 установил защищённый канал связи с сервером VPN 77.111.244.26 по протоколу TLS версии 1.2.
2-Оправляю пакеты... на IP сервер VPN 77.111.244.26
3-сервер VPN 77.111.244.26 преобразует IP в 77.111.244.101 и отправляет моему дому W5500.
4-мой дом W5500 определяет с какого IP пришёл запрос... проверяет корректность запроса (формат пакета, контрольные суммы, ключи шифрования и т.д.) и все эти данные возвращает серверу VPN 77.111.244.101
5-сервер VPN 77.111.244.101 возвращает данные моему компу.
Screenshot_2.jpg
(186.04 KiB) Скачиваний: 32

:roll:
))
точно так же работают другие сервера...
:tea:

Re: Ардуино - запись звука

Чт авг 03, 2023 10:08:31

Изображение

Роман, как сделат автопрокрутку в окне когда пакеты идут?

Re: Ардуино - запись звука

Чт авг 03, 2023 14:09:09

х.з. сам думаю...

Re: Ардуино - запись звука

Чт авг 31, 2023 11:59:15

х.з. сам думаю...

добавил
ta1.setCaretPosition(ta1.getDocument().getLength());
Код:

  //////////////////////////////////////////////////// RX: > ta1
      ta1.append(UDP_RX);                    // > TextArea
    ta1.setCaretPosition(ta1.getDocument().getLength());
     //////////////////////////////////////////////////// RX: > Console 
      //System.out.println(UDP_RX);


Роман, подскажите как писать в случайный файл какждый раз новый

попробовал добавить /изменить
File uniqueFile = File.createTempFile("udp", ".raw", new File("E:/JAVA/"));
RandomAccessFile E_raf = new RandomAccessFile(uniqueFile, "rw");

но теперь пишет файлы по 1кб. Т.е с пониманием логики вашего кода пока проблемы
Мне в перспективе нужно что бы если появились udp пакеты начинался новый файл, если закончились закрывался файл и так по кругу.


Код:
public static void TX_EEPROM() {
//EEPROM_len = 0;               //сброс EEPROM_len           
////////////////////////////////////////////////////////
//////////////////////////////////////////////////////// TX: EEPROM:   
// ASCII UTF-8 !!! HEX
   
try 
{
//"rw" -файл открыт для чтения и записи (если файла нет, то файл будет создан "w").
//"r" -файл открыт для чтения (если файла нет, error).
   File uniqueFile = File.createTempFile("udp", ".raw", new File("E:/JAVA/"));
   RandomAccessFile E_raf = new RandomAccessFile(uniqueFile, "rw");

//RandomAccessFile E_raf = new RandomAccessFile("E:/JAVA/Java2.txt", "rw");
///////////////////////////////////////////проверка файла EEPROM:
EEPROM_len = E_raf.length();     //Возвращает длину файла EEPROM long
if (EEPROM_len > 1000000) {EEPROM_len = 0;}//MAX
///////////////////////////////////////// запись файла EEPROM:
//курсор
E_raf.seek(EEPROM_len); // 
for (xE=0; xE<RX_len; xE++) {       
  E_raf.writeByte(RX_int[xE]);// > write() // HEX     
};
///////////////////////////////////////// закрываем файл EEPROM:
//закрываем файл
E_raf.close();       
}catch(IOException e){

}       
/////////////////////////////////////////// TX EEPROM END
}


Добавлено after 4 minutes 43 seconds:
походу TX_EEPROM() пишет лишь 1кб

Re: Ардуино - запись звука

Чт авг 31, 2023 16:12:17

добавил
ta1.setCaretPosition(ta1.getDocument().getLength());
Код:

  //////////////////////////////////////////////////// RX: > ta1
      ta1.append(UDP_RX);                    // > TextArea
    ta1.setCaretPosition(ta1.getDocument().getLength());
     //////////////////////////////////////////////////// RX: > Console 
      //System.out.println(UDP_RX);

ta1.append(UDP_RX); // добавить >
ta1.setCaretPosition(ta1.getDocument().getLength()); // автопрокрутка

работает))
сам додумался ?

Добавлено after 30 minutes 29 seconds:
File uniqueFile = File.createTempFile("udp", ".raw", new File("E:/JAVA/"));
по моему это тут лишнее))

по моему достаточно этого ))
RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM.txt", "rw");

где "D:/EEPROM.txt" - имя файла, тип файла и путь к файлу.


при вызове этой функции
RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM.txt", "rw");
будет автоматически создан файл "D:/EEPROM.txt"
всё))


чтоб дописать новые данные в файл:

0- создаём массив например длиной 1500 байт (в моём случае это максимальный размер одного Ethernet пакета)
static int [] E_int = new int[1500]; //1500 Ethernet

1- потом открываем нужный файл. (если файла нет, он будет автоматически создан)
RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM.txt", "rw");

2- потом смотрим длину файла
EEPROM_len = E_raf.length(); //Возвращает длину файла EEPROM long

3- затем устанавливаем курсор в конец файла (или в то место куда мы хотим писать новые данные)
E_raf.seek(EEPROM_len);

4- далее производим запись (дописываем в конец файла новые данные)
for (xE=0; xE<1500; xE++) {
E_raf.writeByte(E_int[xE]); // запись массива E_int[xE] в файл "D:/EEPROM.txt"
};

5- затем производим верификацию файла (это по желанию)

E_raf.seek(EEPROM_len); // устанавливаем курсор в то место откуда мы последний раз писали
//E_raf.seek(0); // или устанавливаем курсор в начало файла "D:/EEPROM.txt" для сверки всего файла

for (xE=0; xE<1500; xE++) { // сверяем данные из файла с данными из массива
b_E = E_raf.read(); // читаем файл read() в буфер b_E int по одному байту //возвращает байт HEX или -1 (если байта нет)
if (b_E != E_int[xE]){ //r != w - сверяем данные файла с данными из массива по одному байту
EEPROM_error = 1; //EEPROM_error - данные не совпадают - устанавливаем флаг "ошибка"
};
};

6- и в конце закрываем файл
E_raf.close();

всё))


Добавлено after 5 minutes 19 seconds:
если надо каждый раз писать в новый файл... то тогда каждый раз создаём новый файл... например с новым номером... 1,2,3...

RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM_1.txt", "rw"); // создаём новый файл "D:/EEPROM_1.txt"
...

RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM_2.txt", "rw"); // создаём новый файл "D:/EEPROM_2.txt"
...

RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM_3.txt", "rw"); // создаём новый файл "D:/EEPROM_3.txt"
...

и т.д.

на диски D:/ получаем кучу файлов... ))
EEPROM_1...
EEPROM_2...
EEPROM_3...

и т.д.
походу TX_EEPROM() пишет лишь 1кб

максимальный размер файла... я не проверял))
:dont_know:
в теории максимальный размер файла ограничен переменной long...
а это очень много байт ))

// диапазон значений long
// long 0...9.223.372.036.854.775.807|-9.223.372.036.854.775.808...-1
// long 0...7f ff ff ff ff ff ff ff | 80 00 00 00 00 00 00 00...ff ff ff ff ff ff ff ff
:))

ДА !!!
чтоб использовать переменные типа long в Java на полную катушку надо в конце писать буковку "L"
чтоб Java понимала... что это очень много байт ))
:)

static long EEPROM_len = 0; //объявили переменную (типа long)

например чтоб присвоить переменной EEPROM_len много байт 0xFFFFFFFF пишем так:
EEPROM_len = 0xFFFFFFFFL; // L(!)
...
EEPROM_len & 0x80000000L; // L(!)
EEPROM_len ^ 0x04C11DB7L; // L(!)
...
и т.д.

и везде в коде для переменных типа long надо писать с буковкой L в конце...
как-то так))
roman.com писал(а):максимальный размер файла... я не проверял))

щас проверим)) делов то))

создадим новый файл "D:/EEPROM.txt" размером более 4 гигабайт))

для этого пишем:

// создать новый файл "D:/EEPROM.txt"
RandomAccessFile E_raf = new RandomAccessFile("D:/EEPROM.txt", "rw");

затем устанавливаем курсор на позицию 0xFFFFFFFF

E_raf.seek(0xFFFFFFFFL); // с буковкой L в конце (!)

запускаем Java...

Java подумала немного...
и потом ещё немного...
для Java это большой файл...
:)))

в итоге Java создала новый файл на диске D:/ с именем "EEPROM.txt"...
в конец файла мы дописали ещё 16 байт... для проверки))
итого: на диске D:/ получился файл размером 4.294.967.295 + 16 байт в конце = 4.294.967.311 байт
Screenshot_1.jpg
(45.26 KiB) Скачиваний: 22

вывод: Java умеет создавать/читать/писать файлы размером 4.294.967.311 байт и более...
только при этом Java долго думает)) оно и понятно... это же надо прочитать все 4.294.967.311 байт... причём байт за байтом... а это процесс не быстрый))
:))
в остальном проблем нет.
:tea:

с помощь курсора E_raf.seek(x); можно писать звук в один файл (4 гигабайт и более) по кругу...
получится простой кольцевой буфер...
будет как в видеорегистраторе))
Screenshot_2.jpg
(42.92 KiB) Скачиваний: 24

с помощь курсора E_raf.seek(x); вообще можно много чего делать...

Добавлено after 1 hour 3 minutes 1 second:
PS ))
а я тут решил немного поиграться с телефончиком... ))
сделал радио управление...
Кораблик (1).jpg
(117.93 KiB) Скачиваний: 19

на своём стареньком телефончике ))
Android_4_4_2.jpg
(49.84 KiB) Скачиваний: 18

сделал связь с компом...
комп-android.jpg
(150.69 KiB) Скачиваний: 22

теперь вот думаю... а как мне в мой телефончик добавить звук ? чтоб было как на компе...
:roll:
Android и комп написаны на Java... у них даже программа одинаковая))
но проблема в том что андроид не поддерживает те библиотеки что в компе...
на компе звук играет нормально... в андроид - нет...
для андроид нужно искать другую библиотеку...
или я чёто не понимаю)) видать ещё не до конца разобрался...
:dont_know:
для андроид не писал ещё ?
:tea:

Добавлено after 33 minutes 54 seconds:
можно сделать всё циклично... чтоб при каждом вызове функции создавался новый файл на диске D:/ с новым названием...

например вот так:

static String s = "D:/EEPROM_0.txt";
static int x = 0;

// создаём новый файл "D:/EEPROM_x.txt" с номером "x"
x ++;
s = "D:/EEPROM_" + x + ".txt";
RandomAccessFile E_raf = new RandomAccessFile(s, "rw");
...
Screenshot_1.jpg
(62.98 KiB) Скачиваний: 23

теперь наша Java при каждом вызове функции TX_EEPROM() создаёт новый файл... с новым названием... и записывает туда новые данные))
:tea:

Re: Ардуино - запись звука

Чт авг 31, 2023 17:19:57

да, ничерта у меня не вышло. Поэтому пришлось воспользоваться фичей записи в существующий файл, фактически это то о чем вы говорили в конце последнего поста:
Код:

static String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(Calendar.getInstance().getTime());
public static void TX_EEPROM() {
   //EEPROM_len = 0;               //сброс EEPROM_len           
   ////////////////////////////////////////////////////////
   //////////////////////////////////////////////////////// TX: EEPROM:   
   // ASCII UTF-8 !!! HEX
      
   try
   {
   //"rw" -файл открыт для чтения и записи (если файла нет, то файл будет создан "w").
   //"r" -файл открыт для чтения (если файла нет, error).
    //  File uniqueFile = File.createTempFile("udp", ".raw", new File("E:/JAVA/"));
      

   
   RandomAccessFile E_raf = new RandomAccessFile("E:/JAVA/Jv"+ timeStamp +".raw", "rw");
      //RandomAccessFile E_raf = new RandomAccessFile(uniqueFile, "rw");
   ///////////////////////////////////////////проверка файла EEPROM:
   EEPROM_len = E_raf.length();     //Возвращает длину файла EEPROM long
   if (EEPROM_len > 1000000) {EEPROM_len = 0;x++;
   timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(Calendar.getInstance().getTime());
   }//MAX
   ///////////////////////////////////////// запись файла EEPROM:
   //курсор
   E_raf.seek(EEPROM_len); //
   for (xE=0; xE<RX_len; xE++) {       
     E_raf.writeByte(RX_int[xE]);// > write() // HEX     
   };
   ///////////////////////////////////////// закрываем файл EEPROM:
   //закрываем файл
   E_raf.close();       
   }catch(IOException e){

   }   
//////////////////////////////////////////////
}  //TX_EEPROM



Добавлено after 11 minutes 42 seconds:
я еще хочу что бы если поток прекращается, то текущий записываемый файла закрывался по таймауту, а при возобновлении потока писался уже новый файл и соответственно время в имени файла было правильное.

Теперь же при возобновлении потока запись продолжается в незкарытый файл,. что не айс

Re: Ардуино - запись звука

Чт авг 31, 2023 17:35:07

что не вышло ? не пойму...


RandomAccessFile E_raf = new RandomAccessFile("E:/JAVA/Jv"+ timeStamp +".raw", "rw");
эта функция сама записывает данные в существующий файл... ей "фичи" не нужны))


во первых...
в конце есть обработчик ошибок "IOException"...
напиши туда например System.out.println(e);

//закрываем файл
E_raf.close();
}catch(IOException e){
System.out.println(e); // > вывод ошибок в консоль
}

теперь при открытии файла в консоле будем видеть все ошибки... если что-то пошло не так))
:tea:
хотя что там вообще может пойти не так)) "файл не найден" или типа того))

Re: Ардуино - запись звука

Чт авг 31, 2023 17:48:20

Роман, как закрыть файл по таймауту, если поток юдп прекратился

Re: Ардуино - запись звука

Чт авг 31, 2023 17:59:50

проверяем...
:roll:

// создаём новый файл...
RandomAccessFile E_raf = new RandomAccessFile("E:/JAVA/Jv"+ timeStamp +".raw", "rw");

ошибка )) путь не найден ! ))
Screenshot_2.jpg
(4.51 KiB) Скачиваний: 19

а что это значит ?))
а то что
RandomAccessFile E_raf = new RandomAccessFile("E:/JAVA/Jv"+ timeStamp +".raw", "rw");
не создаёт папок ! он создаёт только файлы в существующих папках !

значит, перед тем как писать что либо в папку... надо сначала создать эту самую папку ))
чтоб Java знала куда писать файл...

1- создаём папку JAVA на диске D:/
2- потом указываем Java что мы хотим писать файл с именем Jv в папку JAVA которая находится на диске D:/

и о чудо ! всё записалось !
Screenshot_4.jpg
(9.36 KiB) Скачиваний: 20

:tea:
Ответить