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

Обсуждаем контроллеры компании Atmel.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

и чёй то... WEB сервер с WAV файлами... ))
а работать в браузере вообще небезопасно))
а сервер свой надо иметь))
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

что у нас со звуком... ? ))

допиливаем самодельный скайп... для андроида))
комп_андроид.jpg
(164.57 КБ) 88 скачиваний
уже можно звонить...
звук хороший... лучше чем в заводском скайпе)) потому что у нас нет никаких кодеков... поэтому звук чистый))
:music:
только видео ещё пока нет...
скайп.jpg
(49.21 КБ) 92 скачивания
но скоро будет))
:tea:

осталось решить вопрос с NAT... пипец эти NAT...
NAT это зло ! ))
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

у меня кстати сервер, на который звуковые файлы идут за NATом.

Добавлено after 3 minutes 30 seconds:
но это дорога в одну сторону. Т.к как сервер имеет белый IP.
Кстати у одного метсного мобильного оператора нашел "дыру". В его сети Пакеты udp идут в обе стороны.
Но если начну что-то мутить сисадмины могут увидеть трафик и прикрыть "лавочку". Вот сижу и думаю стоит ли начинать.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

olegue писал(а):В его сети Пакеты udp идут в обе стороны.
а что... у других не идут ?))
ну так используй... по полной ))

вообще мобильные операторы дают только Статический IP-адрес... из своей локалки... и вроде бесплатно))
Screenshot_1.jpg
(12.87 КБ) 91 скачивание
белый IP не дают... А может уже и дают... но я такого не слышал))
потом надо будет уточнить... пока не нужно.

вообще изначально я разрабатывал систему связи через бесплатный Wi-Fi... которым покрыт весь центр города... есть в каждом фонарном столбе...))
Screenshot_2.jpg
(42.57 КБ) 86 скачиваний
Добавлено after 56 minutes 42 seconds:
MAC -00:08:22:x:x:x андроид))
интересно что при каждом выходе из спячки андроид подключается к сохраненной Wi-Fi точке...
при этом каждый раз меняет MAC... 00:08:22:x:x:x... чтоб низя было отследить пользователя по MAC...
Screenshot_1.jpg
(28.08 КБ) 74 скачивания
причём на компе это делается вручную...
на андроиде это уже настроено с завода...

а сам чип Wi-fi сделан на тайване))
первые три цифры - производитель чипов))
Screenshot_3.jpg
(29.63 КБ) 76 скачиваний
даже адрес есть))
Screenshot_2.jpg
(32.26 КБ) 81 скачивание
всё с вами понятно))
:tea:

как это влияет на связь ?
никак )) ARP с этим справляется прекрасно))
:tea:

Добавлено after 17 minutes 30 seconds:
ну так себе безопасность))
:))
вообще это отдельная большая тема))
:tea:
на самом деле сейчас отслеживают пользователей не по IP, а по всяким "отпечаткам" и активности в сети))

например каждый раз когда ты используешь свой браузер твой браузер передаёт на сервер всю информацию о тебе...
операционная система... тип браузера... ядро... версия... Linux... Android 4.2.2... и т.д.
я уже не говорю про всякие куки))
андроид.jpg
(83.82 КБ) 82 скачивания
ты ещё даже не успел подключиться к серверу... а твой андроид тебя уже сдал ! ))
:))
поэтому нормальные люди браузеры не используют))
ну разве только в некритичных приложениях... типа управлялки))
Кораблик_WEB.jpg
(150.1 КБ) 79 скачиваний
там информация не выходит за пределы локалки))
Screenshot_7.jpg
(233.48 КБ) 68 скачиваний
:tea:

Добавлено after 10 minutes 26 seconds:
щас все скажут... ну как же ! есть же VPN ! ))
есть... и он тоже работает по юдп... точнее там динамически все переключается...
VPN.jpg
(185.08 КБ) 207 скачиваний
в этом случае все твои данные хранятся на сервере VPN )) класс))
вообще это отдельная тема...
:tea:

Добавлено after 3 minutes 20 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=4473491#p4473491"]у одного метсного мобильного оператора нашел "дыру". В его сети Пакеты udp идут в обе стороны.[/uquote]
это нормально)) так работает заводской скайп...
Screenshot_10.jpg
(129.24 КБ) 68 скачиваний
но это тоже отдельная большая тема))
:tea:
но вернёмся к нашим железкам...
железо.jpg
(166.55 КБ) 222 скачивания
теперь надо организовать коммутацию пакетов... добавить функций всяких... и обмануть NAT ))
:tea:

Добавлено after 1 hour 18 minutes 44 seconds:
к слову... гугл уже 10 лет двигает свой новый протокол... HTTP3... который к слову работает по юдп))
Screenshot_1.jpg
(57.68 КБ) 68 скачиваний
но пока с переменным успехом))
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

[uquote="roman.com",url="/forum/viewtopic.php?p=4473513#p4473513"]
olegue писал(а):В его сети Пакеты udp идут в обе стороны.
а что... у других не идут ?))
ну так используй... по полной ))


:tea:[/uquote]

у других не идут и между операторами тоже не идут.
Просто перебирал операторов и смотрел и наткнулся на эту фишку
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

мне мой провайдер завел оптику в дом... поставил медиаконвертер (GPON)... и выделил постоянный белый IP...
и всё бесплатно ! )) :)
зачем мне мобильный оператор ? ))
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

далее...
что то не могу придумать логику работы нашего самодельного телефона))
:roll:
пока только добавили второй поток - для управления.
теперь два потока - аудио и управление. типа как в FTP ))
комп_андроид.jpg
(173.43 КБ) 66 скачиваний
теперь можно разговаривать по телефону и параллельно принимать другие звонки)) звонок работает независимо.
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

[uquote="roman.com",url="/forum/viewtopic.php?p=4472248#p4472248"]
roman.com писал(а):16 бит * 16000 семплов = 256000 бит/c... по Wi-Fi... полный дуплекс )) и это ещё не предел))
а с этим проблема))
:roll:

в режиме воспроизведения андроид поддерживает
8000,11025,16000,22050,44100
16,8 бит
8)

в режиме записи андроид поддерживает только
8000,11025,16000
16 бит
:?

фигово)) а хотелось не только слушать... но и записывать в высоком качестве))
значит в караоке попеть не получится))[/uquote]
всё зависит от прошивки в телефоне...

прошивка Android 4.4.2 KitKat - в режиме записи андроид поддерживает только
8000,11025,16000
16 бит

поменял прошивку на Android 4.2.2 - теперь в режиме записи андроид поддерживает
8000,11025,16000,22050,44100
16 бит
:tea:

Добавлено after 16 minutes 21 second:
[uquote="roman.com",url="/forum/viewtopic.php?p=4473513#p4473513"]есть же VPN ! ))[/uquote]
через VPN работает отвратительно...
большая потеря пакетов... нормально разговаривать невозможно... всё тормозит...
но изначально связь и не рассчитывалась работать по VPN)) поэтому пофиг))
:tea:

Добавлено after 4 minutes 44 seconds:
[uquote="roman.com",url="/forum/viewtopic.php?p=4473628#p4473628"]мне мой провайдер завел оптику в дом... поставил медиаконвертер (GPON)... и выделил постоянный белый IP...
и всё бесплатно ![/uquote]
бесплатно - знаем где))
мой провайдер решил что фигу вам а статический белый IP ! ))
теперь мой провайдер даёт мне динамический белый IP ! ))
класс))
при каждом передергивании роутера получаем новый IP ! ))
и как теперь связываться с домом... пока не ясно...
:tea:

Добавлено after 33 minutes 8 seconds:
первое что приходит на ум... добавить в программу сканер IP ))
т.к. количество IP у провайдера ограничено... то передрать все IP провайдера и найти свой... не займёт много времени))
159.194.0.2
159.194.0.3
159.194.0.4
...
159.194.255.254
правда там несколько пулов ))
27.24.0.2
27.24.0.3
27.24.0.4
...
27.24.255.254
и т.д. ))
:tea:
пипец... озадачили))
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

пишем звук на телефоне... под android ))
всё тоже самое что на компе...
:tea:

добавляем разрешение... AndroidManifest:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...

Создаём файл для записи (в память телефона)...
RandomAccessFile E_raf = new RandomAccessFile("storage/emulated/0/Document/EEPROM.txt", "rw");
...

а вот рекордер на телефоне под android немного отличается...
@SuppressLint("MissingPermission") AudioRecord record = new AudioRecord(TEST_STREAM_TYPE_MIC, TEST_SR_MIC, TEST_CONF_MIC, TEST_FORMAT_MIC, mic_byte_wavt.length);
...

в остальном всё тоже самое что на компе...
всё работает))
:tea:

Добавлено after 46 seconds:
када уже будем писать на Ардуино ?))
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

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

тема такая. Известно ,что udp пакет состоит из заголовка и данных.
Мне нужно передать 4 бита дополнительной информацаии. Вопрос в том как это сделать
Всадить 4 бита при отравки я думаю смогу. Как вашем плейере обработать этот момент.
Я собираюсь использвоать первый 4 бита данных под свою информацию
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

[uquote="olegue",url="/forum/viewtopic.php?p=4477762#p4477762"]Известно ,что udp пакет состоит из заголовка и данных[/uquote]
Известно))
как устроен udp пакет мы подробно разобрали в другой теме... про радиоуправление))

//unsigned char UDP[]={ // 60
//Destination MAC: // 0...5
//0xff,0xff,0xff,0xff,0xff,0xff,
//Source MAC: // 6...11
//0x00,0x08,0xdc,0x01,0x02,0x03,
//Type:
//0x08,0x00, // 12,13- Type: IP (0x0800)
/////////////////////////////////////////////// Protocol IP: 20 bytes
//0x45, // 14- Version: 4, Header length: 20 bytes
//0x00, // 15- Differentiated Services Field...
//(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46)
//0x00,0x2e, // 16,17- Total Length: 46
//0x00,0x00, // 18,19- Identification: 0
//0x00,0x00, // 20,21- Fragment offset: Don't fragment: 0
//0x40, // 22- Time to live: 64
//0x11, // 23- Protocol: UDP (17)
//0x00,0x00, // 24,25- Header checksum IP: // начальное =0
//192,168,0,3, // 26...29- Source IP:
//192,168,0,101, // 30...33- Destination IP:
/////////////////////////////////////////////// Protocol UDP
//0x00,0x50, // 34,35- Source port: 80
//0x00,0x50, // 36,37- Destination port: 80
//(Length = Protocol UDP(8) + Data(18) = 26)
//0x00,0x1a, // 38,39- Length: 26
//0x00,0x00, // 40,41- checksum UDP: // начальное =0
/////////////////////////// 42...59- Padding(18 bytes):
//0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//0x00, 0x00
//};

:tea:

Добавлено after 3 minutes 10 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=4477762#p4477762"]Мне нужно передать 4 бита дополнительной информацаии.[/uquote]
я передаю дополнительно 48 байта в заголовке каждого пакета...
точно так же как Skype передаёт 24 бита (это не точно) в заголовке каждого пакета... (на анализаторе это хорошо видно).
:tea:

Добавлено after 8 minutes 27 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=4477762#p4477762"]Как вашем плейере обработать этот момент.[/uquote]
тупо из буфера плеера...
static byte[] mic_byte_wavt = new byte[1420];//1420wavt(микрофон)
переписываем байты в буфер передатчика...
static byte[] TX_byte_wavt = new byte[1472];//1472 Ethernet
вот так...
//16v+32p+1420date+4crc=1472byte//UDP: MAX=1472.
xxTX_wavt = 0;
for (xTX_wavt=48; xTX_wavt<1468; xTX_wavt++) {
TX_int_wavt[xTX_wavt] = mic_byte_wavt[xxTX_wavt]; //byte 0...127|-127...0 > int 0...255
if (TX_int_wavt[xTX_wavt] < 0){TX_int_wavt[xTX_wavt] += 256;}
xxTX_wavt++;
};
затем в начало буфера передатчика добавляем заголовок... считаем... шифруем... и т.д.))
//16v+32p+1420date+4crc=1472byte//UDP: MAX=1472.
...
потом всё это отправляем по сети... Ethernet... Wi-Fi... не важно))
...
DatagramPacket dp_wav = new DatagramPacket(TX_byte_wavt, TX_len_wavt, InetAddress.getByName(TX_IP_wavt),TX_port_wavt);
socket_wav.send(dp_wav); // UDP: MIN=18; MAX=1472.
...
всё))
:tea:

в приёмнике процесс обратный...

принимаем пакет...
...
DatagramPacket reply_wav = new DatagramPacket(RX_byte_wavr, RX_byte_wavr.length);
socket_wav.receive(reply_wav); // UDP: MIN=18; MAX=1472.
...
извлекаем заголовок... считаем... расшифруем... и т.д.))
...
потом тупо из буфера приёмника...
static int [] RX_int_wavr = new int[1472]; //1472 Ethernet
переписываем байты в буфер плеера...
static byte[] din_byte_wavr = new byte[1420];//1420wavr(динамик)
вот так...
//16v+32p+1420date+4crc=1472byte//UDP: MAX=1472.
xxRX_wavr = 0;
for (xRX_wavr=48; xRX_wavr<1468; xRX_wavr++) {
din_byte_wavr[xxRX_wavr] = (byte) RX_int_wavr[xRX_wavr];//int > din(динамик)
xxRX_wavr++; //1420
};
потом передаём плееру...
RX_line.write(din_byte_wavr, 0, din_byte_wavr.length);//1420wav(динамик)
плеер играет...))
:music:
...
всё))
:tea:

Добавлено after 52 minutes 53 seconds:
к слову... в android есть ещё одна интересная библиотека... Android Player.
у Android Player есть встроенный кодер/декодер MP3 ! ))
:)
с его помощью мы можем записывать/читать наш звук в формате MP3.
можем переводить наш WAV > MP3 и наоборот MP3 > WAV.
будем иметь ввиду)) потом поиграемся))
:tea:
а можем даже сделать интернет радио... из android))
:roll:
1-открываем простой плеер на ПК...
плеер.jpg
(25.8 КБ) 366 скачиваний
2-берём IP адрес и номер порта...
IP.jpg
(66.93 КБ) 561 скачивание
3-закидываем IP адрес и номер порта в плеер на ПК... плеер подключается к серверу...
плеер_205_164_62_15_10032.jpg
(193 КБ) 358 скачиваний
4-при подключении к серверу плеер передаёт обычный GET запрос...

GET / HTTP/1.0
Accept: */*
User-Agent: WINAMP
Icy-MetaData:1
Host: 205.164.62.15:10032
GET запрос.jpg
(170.96 КБ) 366 скачиваний
5-сервер передаёт плееру обычный HTTP ответ...

HTTP/1.0 200 OK
icy-br: 192
icy-pub: 1
icy-description: 1.FM - Radio Gaia
icy-url: http://1.fm
Instance-id: ab50168940339c8583715106639d847f
Cache-Control: no-cache
Server: AIS Streaming Server 8.6.5
icy-genre: Chill
Expires: Mon, 26 Jul 1997 05:00:00 GMT
icy-metaint: 8192
Pragma: no-cache
icy-name: 1.FM - Radio Gaia
Connection: close
Content-Type: audio/mpeg
HTTP ответ.jpg
(165.5 КБ) 335 скачиваний
6-и сразу же сервер передаёт плееру MP3 поток...

ff fb b2 64 e7 88 c5 ce 68 d3 53 6f 64 50 77 ca...

Добавлено after 2 minutes 7 seconds:
MP3 поток.jpg
(181.83 КБ) 1240 скачиваний
играет музыка))
:music:

7-подробней...
вначале идёт заголовок (ff)... тип файла(fb)... битрейт... и т.д.
ff fb b2 64 e7 88 c5 ce 68 d3 53 6f 64 50 77 ca...
описание.jpg
(84.05 КБ) 835 скачиваний
потом сам MP3 поток...

Всё ! ))

аналогично можно сделать на android...

но сначала надо доделать наш мессенджер))
мессенджеры.jpg
(55.15 КБ) 909 скачиваний
в принципе он уже работает)) осталось решить вопрос с IP сервера...
мой провайдер решил больше не выдавать статических IP... вместо этого выдаёт динамические IP... из своего списка))
типа решил экономить на IP ))
как мне теперь найти свой IP...
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

да, верно проблем особых нет. Ятут и сам уже малость подсуетился с кодом. Спасибо, Роман, всегда выручаете.

Добавлено after 4 hours 39 minutes 11 seconds:
Контрольная сумма (Checksum): Это 16-битное поле, которое используется для обеспечения целостности данных в пакете. Это поле не обязательно и может иметь значение 0, если контрольная сумма не используется.

может это подъвязат что бы в данные не лезт
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

olegue писал(а):Контрольная сумма (Checksum)
ты же сам ответил...
olegue писал(а):Это поле не обязательно и может иметь значение 0
1-должно быть или Контрольная сумма (Checksum) или значение 0.
2-только для IPv4 можно значение 0... для IPv6 должно быть только Контрольная сумма (Checksum).
3-ты не сможешь это использовать это из Java... в Java нет такой функции - менять Контрольная сумма (Checksum)
Если использовать ардуино то можно менять Контрольная сумма (Checksum) ... В ардуино вообще всё можно менять))
:tea:
а чем тебе не нравится заголовок ? все нормальные люди передают заголовки...
:roll:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

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

Сообщение olegue »

Так вот есть такое, называется, pear to pear соединение, используется в телеграмме если для звонков в том случает если известны ip адреса абонентов то их соединяют таким вот образом а не через сервер.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

я использую pear to pear соединение... комп <> android
комп_андроид.jpg
(173.43 КБ) 52 скачивания
в телеграмме... не знаю)) можно выяснить... по анализатору))
olegue писал(а):если известны ip адреса абонентов то их соединяют таким вот образом а не через сервер.
кто их "соединяет" ? ))
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

[uquote="olegue",url="/forum/viewtopic.php?p=4477801#p4477801"]может это подъвязат что бы в данные не лезт[/uquote]
там ещё порт есть... его можно крутить как угодно... если что))

продолжаем делать наш типа мессенджер))
Screenshot_1.jpg
(113.05 КБ) 212 скачиваний
звонить уже можно...
:tea:
ещё бы видео добавить в андроид... для этого есть замечательная библиотека Robot...
только new Robot(); в андроид не работает...
:roll:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

ещё подкрутили))
Screenshot_1.jpg
(100.37 КБ) 68 скачиваний
:tea:
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Подскажите, а на какой страничке можно посмотреть результат для изначального запроса? Т.е. таки допилили код записи в sd-карту или нет, или сразу в Ethernet?
Россия навсегда!
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

задачи записи звука в sd-карту с помощью Ардуино... у меня не стояло))

хотя...
1- я цифровал и воспроизводил звук с помощью Ардуино...
2- я записывал и читал данные в sd-карту с помощью Ардуино...

осталось только совместить эти два устройства... в одно ))
пока руки не доходят...
:tea:
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Я ищу интересные примеры для своего демо репозитория, коллекцию пополняю. Когда-то делал запись на карту dbf-файла базы данных:

https://github.com/ViacheslavMezentsev/ ... o3-dbftest

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

Буду отслеживать тему, если появится хоть какой-то прототип, который сможет украсить мою коллекцию.

Добавлено after 19 minutes 54 seconds:
Ещё есть вопрос, как к местному знатоку устройства ethernet в железе.

Во многих современных ПЛК, которые подключаются по Ethernet, есть 2 гнезда, чтобы соединять модули последовательно на одной DIN-рейке. Соединение по Ethernet происходит последовательно, т.е. если в гнездо 1 приходит кабель извне, то из второго гнезда кабель идёт в 1 гнездо второго модуля и так далее.

Если по какой-то причине модуль "отваливается", то пакеты всё равно "проходят" через него (насколько я понял).

Так вот вопрос: для реализации такой архитектуры обязательно иметь внутри ПЛК 3-портовый маршрутизатор (коммутатор) или можно придумать вариант для бедных?
Россия навсегда!
Ответить

Вернуться в «AVR»