tag:blogger.com,1999:blog-75920586360747390672023-11-16T13:05:14.350+02:00hexvolt-блогОсвоение Ubuntu, Python , Django, PostgreSQL и не толькоhexvolthttp://www.blogger.com/profile/15234380228569938689noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-7592058636074739067.post-91218032231728106412013-03-03T13:37:00.000+02:002013-03-03T13:50:41.825+02:00Raspberry Pi. Работаем с GPIO на С - Часть 2<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiHvMsmhyJTdGrhkIL__IrOPJw5RT0fp0WhbGX6avDvIPIAoJVjvqZao1GkYUIxIds3_t5w6SgWxn72XCV_FSNUG8_jFzGMvP8JbZhrmkGsvvW7w0-paYbDCr2tVIbeuSvz6uDPGJrml4/s1600/raspberry_gpio.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /></div>
Это продолжение <a href="http://hexvolt.blogspot.com/2013/02/raspberry-pi-gpio.html" target="_blank">предыдущей статьи</a> о работе с <i>GPIO Raspberry Pi</i>. В данной статье речь пойдет о том, как работать с <i>GPIO</i> на языке <i>C,</i> и как добиться от <i>GPIO</i> максимальной скорости работы.<br />
<br />
Максимальная частота <i>GPIO</i>, которую удалось получить в предыдущей статье с помощью <i>Python </i>составила ~27 кГц. Надо сказать, такого быстродействия вполне достаточно для большинства задач, требующих частого переключения управляющего сигнала (например, управление динамической индикацией, вроде бегущих строк). Тем не менее, не исключены ситуации, когда от логических выводов <i>Raspberry Pi</i> может потребоваться большее быстродействие (ну например, чтобы принимать сигналы от пульта дистанционного управления нужно регистрировать сигналы с фото-датчика, несущая частота которого составляет 30-56 кГц). Как бы там ни было, интересно узнать предельные возможности <i>GPIO</i> и увидеть, насколько большой прирост производительности может дать <i>C</i>. Забегая вперед, скажу, что полученные результаты меня приятно удивили. <b>Черновая редакция.</b></div>
<a name='more'></a><br />
<div style="text-align: justify;">
<h3>
Исходное состояние</h3>
</div>
<div style="text-align: justify;">
<br />
Исходное состояние мини-ПК такое же, как и в предыдущей статье: установлена и настроена ОС <i>Raspbian</i>, подключено два кабеля (питание и <i>Ethernet</i>), <i>IP</i>-адрес <i>Raspberry - </i>192.168.1.35. Работа с <i>Raspberry Pi </i>также велась удаленно через терминал посредством <i>SSH</i>, хотя принципиального значения это не имеет. Как настроить <i>SSH</i> доступ описано <a href="http://hexvolt.blogspot.com/2013/01/raspberry-pi-ssh-linux.html" target="_blank">тут</a>. Все эксперименты проводились с тем же самым выводом общего назначения <i>GPIO 7 </i>(он же <i>P1-26</i>).</div>
<br />
<h3 style="text-align: left;">
Лабораторная "установка" и оборудование</h3>
<br />
<div style="text-align: justify;">
Для наблюдения сигнала на <i>GPIO 7</i> использовался цифровой осциллограф <i>Tektronix TDS1002B</i>. Привожу фото осциллографа и всей установки (собственно, в предыдущей статье я использовал такое же оборудование, в прошлый раз я его не сфотографировал, поэтому выкладываю тут).</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipHMTcY2xkwkFPO1AHPIjjWDvPFdtPAzlnKpLjfEqZBl2JFqu57bbE0_VGCgLanwpieduhDIX_GpnMvh0q59TDR-nODfozZCZiyQQjHMUxSp39-6FueLqaxLYcNOo-TJrdDD1mWWboTPA/s1600/raspberry_stand.png" imageanchor="1" style="float: left;"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipHMTcY2xkwkFPO1AHPIjjWDvPFdtPAzlnKpLjfEqZBl2JFqu57bbE0_VGCgLanwpieduhDIX_GpnMvh0q59TDR-nODfozZCZiyQQjHMUxSp39-6FueLqaxLYcNOo-TJrdDD1mWWboTPA/s320/raspberry_stand.png" style="border: 1px solid black;" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ZpuhgXaWEJfp9TdR7f8H3bX9MeaQ3RWPoWL3wOwsILthzODRUt8gcOgSj_YWAuNbx_Axq9_o7NL1HgFK2VNeDeDrovc1Av2YqW9oG5aIjZTryFGT8O6laTEgqSzDv2Ko34BMyhCwpJY/s1600/raspberry_osc.png" imageanchor="1"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ZpuhgXaWEJfp9TdR7f8H3bX9MeaQ3RWPoWL3wOwsILthzODRUt8gcOgSj_YWAuNbx_Axq9_o7NL1HgFK2VNeDeDrovc1Av2YqW9oG5aIjZTryFGT8O6laTEgqSzDv2Ko34BMyhCwpJY/s320/raspberry_osc.png" style="border: 1px solid black;" /></a></div>
<br />
<span style="font-size: x-small;"><b>Примечание:</b> Эксперименты проводились как с проводом (черно-красный на фото), так и без него (щупы подключены непосредственно к <i>GPIO</i>). Длина провода на полученные результаты не повлияла. Результаты измерений см. ниже.</span><br />
<br />
<h3 style="text-align: left;">
Как работать с <i>GPIO</i> на <i>C</i></h3>
<br />
<div style="text-align: justify;">
Один из вариантов работы с <i>GPIO</i> на языке <i>C</i> - это использование библиотеки <i>bcm2835</i>, документацию и последнюю версию которой можно скачать <a href="http://www.open.com.au/mikem/bcm2835/" target="_blank">здесь</a>.</div>
<br />
<b>0) Скачиваем и устанавливаем библиотеку "<i>bcm2835</i>"</b><br />
<i><br />
</i> <span style="text-align: justify;">В терминале </span><i style="text-align: justify;">Raspberry Pi </i><span style="text-align: justify;">набираем:</span><br />
<div style="text-align: justify;">
<span style="color: #990000;"> wget www.open.com.au/mikem/bcm2835/bcm2835-1.21.tar.gz</span> - скачиваем библиотеку</div>
<div style="text-align: justify;">
<span style="color: #990000;"> tar zxvf bcm2835-1.21.tar.gz</span> - распаковываем архив, появится папка <i>bcm2835-1.21/</i><br />
<span style="color: #990000;"> cd bcm2835-1.xx</span> - заходим в папку, компилируем и устанавливаем библиотеку:<br />
<span style="color: #990000;"> ./configure </span> <br />
<span style="color: #990000;"> make </span> <br />
<span style="color: #990000;"> sudo make check </span> <br />
<span style="color: #990000;"> sudo make install</span> </div>
<div style="text-align: justify;">
<br />
<span style="font-size: x-small;"><b>Примечание:</b> для последующей работы рекомендую использовать консольный файловый менеджер <i>mc</i>.</span><br />
<br />
<b>1)</b><br />
<br />
<h3>
Характеристики <i>GPIO</i></h3>
<br />
<b>1. Обычный режим</b><br />
Для проверки максимальной скорости <i>GPIO Raspberry</i> использовался следующий код:<br />
<br />
<br />
<details><summary>Исходный код</summary><br />
<span style="color: #990000;">#include <stdio.h></span><br />
<span style="color: #990000;">#include <stdlib.h></span><br />
<span style="color: #990000;">#include <string.h></span><br />
<span style="color: #990000;">#include <unistd.h></span><br />
<span style="color: #990000;">#include <errno.h></span><br />
<span style="color: #990000;">#include <bcm2835.h></span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">#define PIN RPI_GPIO_P1_26</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">int main(int argc, char **argv, char **envp) {</span><br />
<span style="color: #990000;"> int i;</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> if (!bcm2835_init())</span><br />
<span style="color: #990000;"> exit(EXIT_FAILURE);</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> for(i = 0; i < 5000; i++) {</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, HIGH);</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, LOW);</span><br />
<span style="color: #990000;"> }</span><br />
<span style="color: #990000;"> bcm2835_close();</span><br />
<span style="color: #990000;"> return (EXIT_SUCCESS);</span><br />
<span style="color: #990000;">}</span><br />
</details><br />
<div>
<br /></div>
Что получилось в результате:<br />
<br />
<div style="text-align: justify;">
<img alt="Raspberry GPIO на C - обычный режим" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinJ0wCOfKlDC1qSSP-OBdKjjzGgdzPo7pa5vFMNL61VbR6bMWrB4hwmPF2A5KV7_ccTl4E4fyJbdKX5_azPjRQjOj6x8Jyjk5PBEjTSYzwGF8DQi43tIH-vtFsTDg8dE6cHSviD08HQGs/s1600/gpio_wire_without_fifo_1.png" style="border: 1px solid black; float: left;" title="Raspberry GPIO на C - обычный режим" /> <img alt="Raspberry GPIO на C - обычный режим" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBDdLPkHUUfo_GUoHdKzjKJfbEJQUMrQ-33UQ5ooUOC9MBhQc6Skb1ZFoB9xAxz-vdfZNpPBU16xyOxj43Zm06cYaIzyFf-7-B4NWHJqTqPYStk8Lxhuz-v3bafZ9iA_TUAug7c216K4Q/s1600/gpio_wire_without_fifo_2.png" style="border: 1px solid black;" title="Raspberry GPIO на C - обычный режим" /></div>
<br />
Минимальная длительность импульса - 100 нс, частота переключения - 5 МГц!<br />
<br />
<b>2. Алгоритм планирования - SCHED_FIFO, sched_priority = 1</b><br />
<br />
<br />
<details><summary>Исходный код</summary><br />
<span style="color: #990000;">#include <stdio.h></span><br />
<span style="color: #990000;">#include <stdlib.h></span><br />
<span style="color: #990000;">#include <string.h></span><br />
<span style="color: #990000;">#include <unistd.h></span><br />
<span style="color: #990000;">#include <errno.h></span><br />
<span style="color: #990000;">#include <sched.h></span><br />
<span style="color: #990000;">#include <bcm2835.h></span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">#define PIN RPI_GPIO_P1_26</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">int main(int argc, char **argv, char **envp) {</span><br />
<span style="color: #990000;"> int i;</span><br />
<span style="color: #990000;"> struct sched_param sp;</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> if (!bcm2835_init())</span><br />
<span style="color: #990000;"> exit(EXIT_FAILURE);</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> sp.sched_priority = 1;</span><br />
<span style="color: #990000;"> if ( sched_setscheduler( 0, SCHED_FIFO, &sp ) !=0 )</span><br />
<span style="color: #990000;"> fprintf(stderr, "%s:%i sched_setscheduler(): %s\n", __FILE__, __LINE__, strerror(errno));</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> for(i = 0; i < 5000; i++) {</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, HIGH);</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, LOW);</span><br />
<span style="color: #990000;"> }</span><br />
<span style="color: #990000;"> bcm2835_close();</span><br />
<span style="color: #990000;"> return (EXIT_SUCCESS);</span><br />
<span style="color: #990000;">}</span><br />
</details><br />
<div>
<br /></div>
<div>
Результаты:</div>
<br />
<div style="text-align: justify;">
<img alt="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=1" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheWijt1D3sbCYE706BkQ6O1DVldWhFtQyB8BWDrHcRrHuNpvJS9qpPZ_nUWSSilFUaqk5QLeARPIh5oH51_gVguWp8iM93vHjvZe937yPUguwlMBscMdd6Ulwzr0MUMG0YquUEXszeqkE/s1600/gpio_with_fifo_1.png" style="border: 1px solid black; float: left;" title="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=1" /> <img alt="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=1" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXtNUl4d5sTfJIEbcCg-TOPpZqPz54FWp38qtldEnNysRUEKDpYiV3tKiDVe07GpZXbLzPpcm1ruk_KVBGkoApOycENf8MUIi2Pe7LlsK8d7h2JumR1ahHWXIZJ7whyphenhyphen8so0xdt0Iv2tmk/s1600/gpio_with_fifo_2.png" style="border: 1px solid black;" title="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=1" /></div>
<br />
Результат - без изменений. Как и в первом случае, при многократном повторении эксперимента иногда возникают задержки (просадка на левом графике), причина которых - многозадачность <i>Linux</i>.<br />
<br />
<b>3. Алгоритм планирования - SCHED_FIFO, sched_priority = MAX</b><br />
<b><br /></b>
<br />
<details><summary>Исходный код</summary><br />
<span style="color: #990000;">#include <stdio.h></span><br />
<span style="color: #990000;">#include <stdlib.h></span><br />
<span style="color: #990000;">#include <string.h></span><br />
<span style="color: #990000;">#include <unistd.h></span><br />
<span style="color: #990000;">#include <errno.h></span><br />
<span style="color: #990000;">#include <sched.h></span><br />
<span style="color: #990000;">#include <bcm2835.h></span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">#define PIN RPI_GPIO_P1_26</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;">int main(int argc, char **argv, char **envp) {</span><br />
<span style="color: #990000;"> int i;</span><br />
<span style="color: #990000;"> struct sched_param sp;</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> if (!bcm2835_init())</span><br />
<span style="color: #990000;"> exit(EXIT_FAILURE);</span><br />
<span style="color: #990000;"> </span><br />
<span style="color: #990000;"> sp.sched_priority = sched_get_priority_max(SCHED_FIFO);</span><br />
<span style="color: #990000;"> if ( sched_setscheduler( 0, SCHED_FIFO, &sp ) !=0 )</span><br />
<span style="color: #990000;"> fprintf(stderr, "%s:%i sched_setscheduler(): %s\n", __FILE__, __LINE__, strerror(errno));</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);</span><br />
<span style="color: #990000;"><br />
</span> <span style="color: #990000;"> for(i = 0; i < 1000; i++) {</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, HIGH);</span><br />
<span style="color: #990000;"> bcm2835_gpio_write(PIN, LOW);</span><br />
<span style="color: #990000;"> }</span><br />
<span style="color: #990000;"> bcm2835_close();</span><br />
<span style="color: #990000;"> return (EXIT_SUCCESS);</span><br />
<span style="color: #990000;">}</span><br />
</details><br />
<div>
<br /></div>
Результат такой же - частота переключения не изменилась. Как и в прошлый раз, с максимальным приоритетом иногда могут возникать задержки:<br />
<br />
<div style="text-align: justify;">
<img alt="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=MAX" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwktyzsNG9X7eJm3GexACEBpNhVsZKlwWZO8A1yO9Xw-pnfvR4KmY0ZADaXZ4ROe4ThHlqqNj18A-hkA7txtarsVN7F-RRQvzWGP0xfp9mJ24QAFHedXrWtZvv0OmPqrUy58y_tjUwphU/s1600/gpio_with_fifomax_1.png" style="border: 1px solid black; float: left;" title="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=MAX" /> <img alt="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=MAX" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuBU6OMYg0Te8wMChrt07iXitN85ise7hFgBq_vUB9BouSJdSBN_ewCLu-qFKNTjhhTClBbOH5pRXzbPd829y1hhlDl_NY13zgocePeP9YIE49HnhtACJVwjL0ZdKDErbvHRPXGMgvQ4Y/s1600/gpio_with_fifomax_2.png" style="border: 1px solid black;" title="Raspberry GPIO на C - режим SCHED_FIFO, sched_priority=MAX" /></div>
<br />
<h3>
Выводы</h3>
<br />
Сведем все результаты в общую таблицу:<br />
<table style="border-collapse: collapse; border: 1px solid gray;"><tbody>
<tr> <td style="border: 1px solid gray; width: 150px;">Показатель</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
Python (RPi.GPIO)</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
C </div>
<div style="text-align: center;">
обычный режим</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
C </div>
<div style="text-align: center;">
<span style="text-align: justify;">SCHED_FIFO, priority = 1</span></div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
C </div>
<div style="text-align: center;">
<span style="text-align: justify;">SCHED_FIFO, priority = MAX</span></div>
</td> </tr>
<tr> <td style="border: 1px solid gray; width: 50px;">Максимальная частота переключения</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
27 кГц</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
5 МГц</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
5 МГц</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
5 МГц</div>
</td> </tr>
<tr> <td style="border: 1px solid gray;">Минимальная длительность импульса</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
18-20 мкс</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
100 нс</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
100 нс</div>
</td> <td style="border: 1px solid gray;"><div style="text-align: center;">
100 нс</div>
</td> </tr>
</tbody></table>
<br />
Таким образом, по сравнению с <i>Python</i>'ом <i>C</i> позволил получить приблизительно 185-ти кратный прирост скорости. Максимальная частота переключения, которую можно программно "выжать" из логических выводов <i>GPIO</i> - 5 МГц (длительность импульса - 100 нс). При этом следует иметь ввиду следующее:<br />
<br />
<ul>
<li>добавление кода в цикл переключения может заметно увеличить длительность пребывания вывода в состояниях "1" и "0";</li>
<li>полученные показатели <u>могут быть нестабильны</u>, поскольку <i>Linux</i> не является ОС реального времени. </li>
</ul>
<br />
Многократное повторение опытов показало, что поведение <i>GPIO</i> и появление "задержек" особо не зависит от алгоритма планирования и приоритета процесса. На данном этапе можно предположить, что положительный эффект от использования режима <i>SCHED_FIFO</i> может быть виден при большой загрузке процессора <i>Raspberry</i>, когда на нем выполняется ряд задач одновременно.<br />
<br />
Поэтому, если через <i>GPIO</i> нужно управлять устройством, крайне критичным к режиму реального времени - таки придется использовать дополнительный микроконтроллер. Если же подключаемое устройство требует "скоростного" сигнала, но допускает появление задержек в несколько микросекунд - то вполне успешно можно использовать <i>GPIO Raspberry</i> без дополнительного контроллера.<br />
<br />
<br />
<b>PS.</b> Благодарность анонимному комментатору из предыдущей статьи за идею с <i>SCHED_FIFO</i> и предоставленный пример кода.</div>
</div>
hexvolthttp://www.blogger.com/profile/15234380228569938689noreply@blogger.com8tag:blogger.com,1999:blog-7592058636074739067.post-18164397956156829872013-02-18T21:12:00.000+02:002013-03-03T13:46:42.415+02:00Raspberry Pi. Работаем с GPIO на Python - Часть 1<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiHvMsmhyJTdGrhkIL__IrOPJw5RT0fp0WhbGX6avDvIPIAoJVjvqZao1GkYUIxIds3_t5w6SgWxn72XCV_FSNUG8_jFzGMvP8JbZhrmkGsvvW7w0-paYbDCr2tVIbeuSvz6uDPGJrml4/s1600/raspberry_gpio.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /></div>
Как-то я писал о том, что планирую использовать <i>Raspberry Pi</i> в качестве веб-сервера, управляющего моим устройством. Пришло время задуматься над интерфейсом подключения. У разработчика, желающего подключить свое железо к <i>Raspberry</i> есть два пути: использовать для этого <i>USB</i> или выводы общего назначения (<i>GPIO</i>). С возможностями <i>USB</i> все приблизительно понятно (в будущем постараюсь написать пост о работе с внешним железом через <i>USB</i>). О <i>GPIO</i> же информации не так много, да и опыта его использования нет. В общем я заинтересовался <i>GPIO </i>и его возможностями. В статье речь пойдет о выводах общего назначения <i>Raspberry Pi</i> - <i>GPIO</i>:<br />
<ul>
<li>возможности <i>GPIO</i></li>
<li>распиновка <i>GPIO</i></li>
<li><i><span style="font-style: normal;">как работать с </span><i>GPIO</i><span style="font-style: normal;"> на </span><i>Python</i></i></li>
<li>характеристики <i>GPIO</i> (прежде всего показатели скорости)</li>
<li>пример использования <i>GPIO Raspberry</i></li>
</ul>
<a name='more'></a><br /></div>
<div style="text-align: justify;">
<h3>
Порт <i>GPIO</i> - выводы общего назначения <i>Raspberry Pi</i></h3>
<br />
Предварительно я <a href="http://hexvolt.blogspot.com/2013/01/raspberry-pi-ssh-linux.html" target="_blank">наладил удаленную работу с <i>Raspberry Pi</i> через <i>SSH</i></a>, чтобы каждый раз не подключать монитор и клавиатуру. Поэтому в исходном состоянии у меня к <i>Raspberry</i> подключено всего два "провода": питание и сетевой кабель для соединения с роутером. Хотя принципиального значения это не имеет: все нижеописанное будет справедливо, как в случае работы с консолью <i>Raspberry</i> через <i>SSH</i>, так и при использовании подключенной клавиатуры.<br />
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTkDxP_Tw0HeuTzKXy-AA15VWGQvLAkJy-bXLw93a78KTzZZChmnrP40gtsoYzwy0XcXyhlG0DnfSE1TN67IaPDsdsAR4cREcyGOZXy4f_KDe7_TMDjpl33lV7XMsIvJBZPdhA58y-2GI/s1600/GPIO2.JPG" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img alt="Raspberry Pi GPIO" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTkDxP_Tw0HeuTzKXy-AA15VWGQvLAkJy-bXLw93a78KTzZZChmnrP40gtsoYzwy0XcXyhlG0DnfSE1TN67IaPDsdsAR4cREcyGOZXy4f_KDe7_TMDjpl33lV7XMsIvJBZPdhA58y-2GI/s320/GPIO2.JPG" style="border: 1px solid black;" title="Raspberry Pi GPIO" width="238" /></a></div>
</div>
<div style="text-align: justify;">
<b>Порт <i>GPIO</i></b> (сокращение от <i>General Purpose Input Output</i>) - это программно управляемые выводы общего назначения, которые могут работать как входы (для считывания сигнала) или как выходы (для передачи сигнала). На <i>Raspberry Pi</i> они выполнены в виде двух рядов штырьков с шагом в 2,54 мм (разъем <i>PLD</i>). Выражение "общего назначения" означает, что эти выводы пользователь может использовать в своих целях так, как ему захочется, поскольку они не выполняют каких-то определенных жестко заданных функций. При работе с <i>GPIO</i> следует только иметь ввиду, что это <b>цифровые выводы</b> с максимальным уровнем напряжения 3,3 В, соответствующим логической единице. Поэтому программно выводить на <i>GPIO</i> аналоговый сигнал или подавать на него аналоговый сигнал извне для последующий оцифровки нельзя.<br />
<br />
Итак, что представляет собой порт <i>GPIO</i> и каковы его возможности? <i>GPIO</i> объединяет в себе 26 выводов, среди которых присутствуют следующие:<br />
<ul>
<li>2 вывода с постоянным уровнем напряжения 5 В</li>
<li>2 вывода с постоянным уровнем напряжения 3,3 В</li>
<li>5 общих выводов (земля)</li>
<li>17 цифровых программно управляемых выводов</li>
</ul>
<br />
Каждый из этих 17 выводов может работать как вход, либо как выход. Однако помимо этого, некоторые из этих выводов могут выполнять альтернативные <u>необязательные</u> функции. Что это значит? Каждый из таких выводов в зависимости от программной настройки могут работать либо как обычный вывод, либо как вывод одного из последовательных интерфейсов. С помощью таких выводов <i>GPIO</i> альтернативно могут реализовываться последовательные интерфейсы <i>I2C</i>, <i>SPI</i> и другие последовательные интерфейсы посредством <i>UART</i>.<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> Это знакомые понятия для тех, кто сталкивался с программированием микроконтроллеров. Для тех, кто не сталкивался и на данном этапе пока желает просто программно выводить "1" и "0" на нужном выводе - знания этих интерфейсов не понадобится. Поэтому не буду здесь уделять этому внимание. Скажу только, что среди микроконтроллеров и других устройств (различные датчики, АЦП, ЦАП, микросхемы памяти) это очень распространенные интерфейсы, поэтому наличие выводов этих интерфейсов в <i>GPIO Raspberry</i> при необходимости позволяет очень легко и с минимумом программного кода "научить" <i>Raspberry</i> "общаться" с вашим устройством.</span><br />
<br />
Как понять где какой вывод находится? Для этого необходима <b>распиновка (цоколевка) GPIO</b>. В <a href="http://elinux.org/RPi_Low-level_peripherals" target="_blank">официальной документации</a> приведена распиновка разных версий <i>GPIO Raspberry Pi</i>. Здесь я приведу самую последнюю на данный момент распиновку <i>GPIO</i> - для <i>Raspberry Pi Model B Rev.2</i>:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFwQfEBHLiMpk-s9_II40TnwL9_AKMDhoO5RLOiJfwtysjBFbqupH7QaEQf5Xo7TubDGBqTyBzeDxj_G0ZL8wyeYo94_hSe1-ynpuiUjIH8qJlULnu9cxRSGoy8AZlUqYZtVgWjjzKDaY/s1600/GPIO1.png" imageanchor="1" style="float: left; margin-right: 1em;"><img alt="Raspberry Pi GPIO" border="0" height="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFwQfEBHLiMpk-s9_II40TnwL9_AKMDhoO5RLOiJfwtysjBFbqupH7QaEQf5Xo7TubDGBqTyBzeDxj_G0ZL8wyeYo94_hSe1-ynpuiUjIH8qJlULnu9cxRSGoy8AZlUqYZtVgWjjzKDaY/s400/GPIO1.png" style="border: 1px solid black;" title="Raspberry Pi GPIO" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0SFDs2MaP6-VG2_yKsa2Xi0CN66Bbv72y7YZZOZO_hfxL6Cfoj6h0y4UiY-wDGHpiJ-oKzspQYjv7ImjExq09-ZdK4oJtev7rEmJKNC5DBYP4qgfu3lwqRwDV4WeHUFojCJTGw9jPuTg/s1600/GPIOs.png" imageanchor="1"><img alt="Распиновка Raspberry Pi GPIO" border="0" height="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0SFDs2MaP6-VG2_yKsa2Xi0CN66Bbv72y7YZZOZO_hfxL6Cfoj6h0y4UiY-wDGHpiJ-oKzspQYjv7ImjExq09-ZdK4oJtev7rEmJKNC5DBYP4qgfu3lwqRwDV4WeHUFojCJTGw9jPuTg/s1600/GPIOs.png" style="border: 1px solid black;" title="Распиновка Raspberry Pi GPIO" /></a><br />
<br />
На схеме в скобках указана альтернативная функция каждого вывода:<br />
<ul>
<li><i>SDA</i>, <i>SCL</i> - выводы интерфейса <i><b>I2C</b></i></li>
<li><i>TXD</i>, <i>RXD</i> - выводы <i><b>UART</b></i></li>
<li><i>MOSI</i>, <i>MISO</i>, <i>SCLK</i>, <i>CE0</i>, <i>CE1</i> - выводы интерфейса <i><b>SPI</b></i></li>
<li><i>GPCLK0</i> - (<i>General Purpose Clock</i>) вывод для формирования варьируемой <b>тактовой частоты</b> для внешних устройств</li>
<li><i>PCM_CLK</i>, <i>PCM_DOUT</i> - выводы аудио-интерфейса <b><i>I2S</i></b></li>
</ul>
<br /></div>
<h3 style="text-align: left;">
Что ВАЖНО знать перед работой с <i>GPIO Raspberry Pi</i></h3>
<div>
<br /></div>
<div style="text-align: justify;">
Пожалуй, это самый важный раздел. Нужно помнить о некоторых особенностях <i>GPIO </i>и соблюдать определенные меры предосторожности, чтобы <strike>не залететь еще на 35-50$</strike> не повредить <i>Raspberry</i>. Ниже приведены такие "критические особенности", а также несколько нюансов, которые просто могут быть полезны, и которые желательно помнить при разработке.</div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li style="text-align: justify;"><b>Максимальный суммарный ток обоих выводов 3.3 В равен 50 мА!</b> Поэтому эти выводы могут использоваться для питания внешних устройств, только если их потребляемый ток меньше 50 мА.</li>
<li style="text-align: justify;"><b>Максимальный суммарный ток обоих выводов 5 В равен 300 мА!</b> Эти выводы также могут использоваться для питания внешних устройств только в том случае, если их потребляемый ток меньше 300 мА.</li>
<li style="text-align: justify;"><b>Нельзя на <i>GPIO</i> подавать напряжение больше 3,3 В! </b>Цифровые выводы <i>GPIO</i> имеют уровни напряжения 0 - 3,3 В и <u>не совместимы</u> с традиционными уровнями напряжения <i><span style="font-style: normal;">0 - 5В</span></i>! Поэтому нельзя напрямую соединять <i>Raspberry Pi</i> и цифровые устройства, работающие с <i>TTL</i>-уровнями 5 В. Если подать на <i>GPIO</i> вывод <i>Raspberry</i> логическую единицу, представляющую собой 5 В, а не 3,3 В - вывод может выйти из строя.</li>
<li style="text-align: justify;"><b>Выводы <i>GPIO 14</i> и <i>GPIO 15</i> по-умолчанию выполняют альтернативную функцию и являются выводами <i>UART</i> - <i>RXD</i> и <i>TXD</i>.</b> Поэтому после включения на них присутствует высокий уровень 3,3 В. Программно их можно переконфигурировать в обычные выводы. Все остальные <i>GPIO</i> после включения <i>Raspberry</i> выполняют основную функцию и работают как обычные цифровые выводы.</li>
<li style="text-align: justify;"><b>Все настраиваемые пины <i>GPIO</i> по-умолчанию являются входами.</b> И поэтому имеют высокое входное сопротивление. При этом подтяжка логического уровня у них не включена, выводы "висят в воздухе", поэтому после включения <i>Raspberry</i> напряжение на них может "плавать". Это нормально. Исключением является только 2 следующих вывода:</li>
<li style="text-align: justify;"><b>Выводы <i>GPIO 0 (SDA)</i> и <i>GPIO 1 (SCL)</i> по-умолчанию "подтянуты" к питанию.</b> Поэтому после включения <i>Raspberry</i> на них присутствует напряжение логической единицы (3,3 В).</li>
<li style="text-align: justify;"><b>Сигнал на любом из цифровых выводов может служить источником внешнего прерывания.</b> Кто раньше сталкивался с микроконтроллерами поймет, насколько это может быть полезно. Как использовать прерывания в <i>Raspberry Pi</i> - пока это идея для следующего поста.</li>
</ul>
<div style="text-align: justify;">
Пожалуй, все.. Ну и в целом нужно помнить, что <i>GPIO</i> - это выводы, непосредственно подключенные к процессору <i>Raspberry Pi,</i> они являются инструментом для взаимодействия с ним. Поэтому неосторожное обращение с <i>GPIO</i> может привести к необратимым последствиям для процессора. <strike>На этом с "пугалками" заканчиваю.</strike> Главное и простое правило - не подавать больших напряжений и не потреблять большой ток. Переходим к делу.</div>
<div style="text-align: justify;">
<br /></div>
<ul style="text-align: left;"></ul>
</div>
<h3 style="text-align: justify;">
Как работать с <i>GPIO</i> на <i>Python</i></h3>
<div style="text-align: justify;">
<br />
<span style="font-size: x-small;"><b>Примечание:</b> Работать с <i>GPIO</i>, по сути, можно двумя способами:</span><br />
<div>
<span style="font-size: x-small;"><b>1)</b> Используя <i>bash</i> и файловую систему <i>Rasbian</i></span><br />
<span style="font-size: x-small;"><i>Raspbian</i> является одним из дистрибутивов <i>Linux</i>, а концепция <i>Linux</i> предполагает, что любой объект является файлом. Именно это позволяет выводить и считывать сигналы с <i>GPIO</i> обычными командами оболочки <i>bash</i> прямо в терминале! Вывод логической единицы при этом выглядит как команда записи "1" в файл, соответствующий нужному выводу. Подробные примеры даны <a href="http://elinux.org/RPi_Low-level_peripherals#GPIO_Driving_Example_.28Bash_shell_script.2C_using_sysfs.2C_part_of_the_raspbian_operating_system.29" target="_blank">здесь</a>. </span><br />
<span style="font-size: x-small;"><br />
</span> <span style="font-size: x-small;"><b>2)</b> Используя языки программирования (самые разные от <i>C</i> до Бэйсика)</span></div>
<div>
<span style="font-size: x-small;">Это более гибкий и более производительный вариант, поскольку он не требует обращения к файловой системе. При этом взаимодействовать с <i>GPIO Raspberry</i> можно на самых разных языках, внушительный список которых приведен <a href="http://elinux.org/RPi_Low-level_peripherals" target="_blank">здесь</a> вместе с примерами. Ниже разберем пример работы с <i>GPIO</i> на <i>Python</i>.</span></div>
<br />
Предположим нам нужно вывести логическую "1" или "0" на <i>GPIO</i> <i>7 </i>и считать сигнал с <i>GPIO 8</i>.<br />
<br /></div>
<div style="text-align: justify;">
<b>0)</b> Для работы с <i>GPIO</i> на <i>Python</i> нужна специальная библиотека <i>RPi.GPIO</i>. Сейчас ее можно установить прямо с репозиториев, а не качать архив и устанавливать вручную, как было раньше. Воспользуемся этой возможностью:</div>
<div style="text-align: justify;">
<span style="color: #990000;"> sudo apt-get install python-rpi.gpio</span> (или <i>python3-rpi.gpio </i>для 3-й версии Питона)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оказывается, в новом дистрибутиве <i>Raspbian</i> она уже установлена, поэтому двигаемся дальше.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>0.5)</b> <i>GPIO</i> является системным элементом <i>Raspbian</i>, поэтому работать с ним нужно <u>только под суперпользователем</u>. Будем писать программу прямо в консоли, поэтому запускаем <i>python</i>: </div>
<div style="text-align: justify;">
<span style="color: #990000;"> sudo python</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>1) Импортируем библиотеку для работы с <i>GPIO</i>:</b></div>
<div style="text-align: justify;">
<span style="color: #990000;"> import RPi.GPIO as GPIO</span><br />
<span style="color: #990000;"><br />
</span> <br />
<div>
<b>2) Устанавливаем способ нумерации выводов <i>GPIO</i>.</b><br />
Зачем? Дело в том, что во многих функциях этой библиотеки необходимо указывать номер вывода, над которым мы хотим произвести какую-либо манипуляцию. Однако указываемый номер можно интерпретировать по-разному: либо это номер <i>GPIO</i>, либо это номер пина (P1-26) на плате <i>Raspberry</i> (см. распиновку). Чтобы не возникало путаницы, сразу после импорта желательно "указать библиотеке", какую нумерацию мы будем использовать в программе.<br />
<span style="color: #990000;"> GPIO.setmode(GPIO.BCM)</span> <span style="color: #38761d;">#GPIO.BCM - будет использоваться нумерация GPIO </span></div>
</div>
<div style="text-align: justify;">
<span style="color: #38761d;"> #</span><span style="color: #38761d;">GPIO.BOARD - будет использоваться нумерация пинов P1-26</span><br />
<span style="color: #38761d;"><br />
</span></div>
<div style="text-align: justify;">
<b>3) Конфигурируем выводы</b><br />
Поскольку мы будем выводить сигналы на <i>GPIO 7</i>, конфигурируем его как выход, а <i>GPIO 8</i> - как вход:<br />
<span style="color: #990000;"> GPIO.setup(7, GPIO.OUT) </span> <span style="color: #38761d;">#конфигурируем GPIO 7 как выход</span><br />
<span style="color: #990000;"> GPIO.setup(8, GPIO.IN) </span> <span style="color: #38761d;">#конфигурируем GPIO 8 как вход</span><br />
<br />
<span style="font-size: x-small;"><b>Примечание: </b>именно после выполнения этой команды на <i>GPIO 7</i> установится ровно 0 В, поскольку этот вывод больше не является входом и на нем нет "плавающего" потенциала.</span><br />
<br />
С помощью необязательного параметра <i>pull_up_down</i> функции <i>setup</i> можно также настроить "<b>подтяжку</b>" вывода к питанию или к земле:<br />
<span style="color: #990000;"> GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_UP)</span> <span style="color: #38761d;">#подтяжка к питанию 3,3 В</span><br />
<span style="color: #990000;"> GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)</span> <span style="color: #38761d;"> #подтяжка к земле 0 В</span><br />
<span style="color: #990000;"> GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_OFF) </span> <span style="color: #38761d;"> #режим по-умолчанию</span><br />
<br />
<b>4) Формируем и считываем сигналы</b><br />
Формируем "1" и "0" на <i>GPIO 7 </i>и считываем сигнал с <i>GPIO 8</i>:</div>
<div style="text-align: justify;">
<span style="color: #990000;"> GPIO.output(7, True) </span> <span style="color: #38761d;">#выводим на GPIO 7 логическую "1" (3.3 V)</span></div>
<div style="text-align: justify;">
<span style="color: #990000;"> GPIO.output(7, False) </span> <span style="color: #38761d;">#выводим на GPIO 7 логический "0"</span><br />
<span style="color: #990000;"> signal = GPIO.input(8) </span> <span style="color: #38761d;">#считываем сигнал с GPIO 8 в переменную signal</span><br />
<br />
<b>5) Завершаем работу</b><br />
После всех нужных операций корректно завершаем работу:<br />
<span style="color: #990000;"> GPIO.cleanup()</span><br />
<br />
Выполнение этой операции приведет к возвращению всех выводов <i>GPIO</i> в первозданное состояние.<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> если не выполнить эту операцию, то даже после закрытия программы и выхода из <i>python</i>, выводы <i>GPIO</i> останутся в том, состоянии, в котором они были на момент завершения. Это может быть чревато тем, что при попытке повторно поработать с этими выводами будет возникать сообщение, о том, что вывод уже используется: </span><span style="font-size: x-small;">"<i>RuntimeWarning: This channel is already in use, continuing anyway</i>."</span><br />
<br />
<br />
<b>Весь пример </b>целиком<b>:</b><br />
<span style="color: #990000;"> import RPi.GPIO as GPIO </span><span style="color: #38761d;">#подключаем библиотеку</span><br />
<span style="color: #990000;"> GPIO.setmode(GPIO.BCM) </span><span style="color: #38761d;">#устанавливаем режим нумерации</span><br />
<span style="color: #990000;"> </span><span style="color: #990000;">GPIO.setup(7, GPIO.OUT) </span> <span style="color: #38761d;">#конфигурируем GPIO 7 как выход</span><br />
<span style="color: #990000;"> GPIO.setup(8, GPIO.IN) </span> <span style="color: #38761d;">#конфигурируем GPIO 8 как вход</span><br />
<span style="color: #990000;"> </span><span style="color: #990000;">GPIO.output(7, True) </span> <span style="color: #38761d;">#выводим на GPIO 7 логическую "1" (3.3 V)</span><br />
<div>
<span style="color: #990000;"> GPIO.output(7, False) </span> <span style="color: #38761d;">#выводим на GPIO 7 логический "0"</span><br />
<span style="color: #990000;"> signal = GPIO.input(8) </span> <span style="color: #38761d;">#считываем сигнал с GPIO 8 в переменную signal</span><br />
<span style="color: #990000;"> </span><span style="color: #990000;">GPIO.cleanup() </span><span style="color: #38761d;">#завершаем работу с GPIO</span></div>
<br /></div>
</div>
<h3 style="text-align: left;">
Характеристики <i>GPIO</i></h3>
<div style="text-align: justify;">
<br />
На мой взгляд, из всех характеристик наиболее интересны временные параметры <i>GPIO</i>, а именно - насколько быстро может меняться состояние цифрового вывода из "1" в "0" и обратно, если управлять портом программно. Для проверки этого использовался следующий код:</div>
<div style="text-align: justify;">
</div>
<span style="color: #990000;"> import RPi.GPIO as GPIO</span><br />
<span style="color: #990000;"> GPIO.setmode(GPIO.BCM)</span><br />
<span style="color: #990000;"> GPIO.setup(7, GPIO.OUT)</span><br />
<span style="color: #990000;"> while (1):</span><br />
<span style="color: #990000;"> </span><span style="color: #990000;">GPIO.output(7, True) </span><br />
<span style="color: #990000;"> </span><span style="color: #990000;">GPIO.output(7, False)</span><br />
<div>
<br /></div>
<div style="text-align: justify;">
Смотрим, что получается на осциллографе, подключенного к выводу 7, при выполнении этого кода:<br />
<br /></div>
<div style="text-align: justify;">
<img alt="Raspberry GPIO частота" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIv-0D-KYU9aHJdC6yB-fo7MBSpS2KnBLzdDmRtAzv0mgNEPtJlzarzWGiYmg8RAYWm_MeuOHVmRdAw_faho46bmv-qMkFBeE54c0j3K1TOSVKjiYk2o6udLbONwI1mJ8uxJS9o_8g1QM/s1600/raspberry_test_2.png" style="border: 1px solid black; float: left;" title="Raspberry GPIO частота" /> <img alt="Raspberry GPIO частота" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2VWgnxuBfn2cM-SWFdq2CcxrWvEaf73AulZ9ocKiaqKo3fhVipI6NaOy97Ds7-nJ8dCkf71cZBB0I98iRfDpb6Wkq6wg1DTSF9JZXE7ruzV4aDs45DI94_BnGbHp-ziwRrERwwOGyf9w/s1600/raspberry_test_3.png" style="border: 1px solid black;" title="Raspberry GPIO частота" /></div>
<div style="text-align: justify;">
<img alt="Raspberry GPIO время нарастания" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs4TedbGE_omJr_quWfpLCNpl6OS0mbYLagK51bQvKl4Q8J_09niF97Jb8QEy3XPa4jOeTnyhDQkkwvj_VcF1995QswYCHDYHp2tWFBa2HGTEJU1OhIU1COJRWsn280Bryg2ocJiiwAKU/s1600/raspberry_test_4.png" style="border: 1px solid black; float: left;" title="Raspberry GPIO время нарастания" /> <img alt="Raspberry GPIO время спада" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAOn_lHBLuob94HuVDa5QZlY8wxdcdj517yWIuqComrywTavjnZKKEFUx8FkjEbJPthWZwFiiIC5Y4r3Uk21X4nx3ssOlKwF7PDRroMQHfwMyae7wBWq1HKeQA35fmyBqmaN2dwcQ33rk/s1600/raspberry_test_5.png" style="border: 1px solid black;" title="Raspberry GPIO время спада" /></div>
<div style="text-align: justify;">
<br />
Итак, программное циклическое переключение цифровых выводов <i>GPIO</i> осуществляется с максимальной частотой ~27 кГц. На второй картинке видно, что в каждом из устойчивых состояний ("1" и "0") вывод может находится в течение ~ 18-20 мкс. Получить импульсы меньшей длительности с помощью используемых в статье программных средств нельзя.<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> частота импульсов, изображенных на верхних картинках, может незначительно колебаться. Это связано с тем, что <i>Linux</i> на <i>Raspberry</i> многозадачна и не всегда уделяет нашей программе все процессорное время. Также следует иметь ввиду, что добавление дополнительных команд внутрь цикла <i>while</i> может существенно увеличить время каждого импульса.</span><br />
<br />
По нижним картинкам можно оценить время переключения пина <i>GPIO</i> из одного состояния в другое (другими словами длительность переходного процесса) - оно составляет приблизительно 50 нс. Надо сказать, довольно неплохие результаты, однако и конкурировать по скорости с ПЛИС <i>GPIO Raspberry</i> <i>Pi </i>не может.</div>
<div style="text-align: justify;">
<br />
<span style="font-size: x-small;"><b>Примечание:</b> о том, каких длительностей можно добиться с использованием C описано в <a href="http://hexvolt.blogspot.com/2013/03/raspberry-pi-gpio-2.html" target="_blank">следующей статье</a>.</span><br />
<br />
Следует иметь ввиду, что те пины <i>GPIO</i>, которые работают в режиме последовательных интерфейсов, <u>позволяют добиться больших скоростей</u>, поскольку при работе последовательных интерфейсов на высоких скоростях процессор аппаратно формирует тактовые частоты и сигналы согласно правилам того или иного последовательного интерфейса. Так, например, с помощью вывода <i>GPCLK0 </i>можно получать импульсы частотой порядка 100 МГц и выше.</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: left;">
Пример использования <i>GPIO Raspberry</i></h3>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Как можно применить все это на практике? Зачем выводить "1" или "0" на <i>GPIO</i>? <strike>Например, можно помигать светодиодами!</strike> Например, можно управлять силовой нагрузкой и включать / выключать любые бытовые приборы, работающие от сети 220 В. Для этого понадобится <i>Raspberry Pi</i> и всего 7 деталей. Схема такого программного "выключателя" приведена ниже:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZA8MP8BuVcRcQR5w_HX35ZhKYNKSc2rRJ8p2D1Y7UUuoixYsHD8-4jP8smJDa57kPocjI26a_Koc7LdZVT_SuGMg1PTJOPRk6-3v9glGUCX-GgQ-KDhzfD79F4S_EPRkFZ7CcXpwa5AY/s1600/gpio_example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi GPIO выключатель" border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZA8MP8BuVcRcQR5w_HX35ZhKYNKSc2rRJ8p2D1Y7UUuoixYsHD8-4jP8smJDa57kPocjI26a_Koc7LdZVT_SuGMg1PTJOPRk6-3v9glGUCX-GgQ-KDhzfD79F4S_EPRkFZ7CcXpwa5AY/s640/gpio_example.png" title="Raspberry Pi GPIO выключатель" width="640" /></a></div>
<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> микросхема-оптодрайвер <i>MOC3041M</i> имеет гальваническую развязку силовых цепей от слаботочных, поэтому она является "барьером безопасности" между <i>Raspberry</i> и сетью 220 В, выход ее из строя не повредит <i>Raspberry</i>. Конденсатор <i>C8</i> должен быть высоковольтным и выдерживать напряжение ~400 В.</span><br />
<br />
Данная схема может коммутировать токи до 16А. Она полностью отлажена, проверена на практике и занимает очень мало места (к сожалению, у меня не сохранились фото устройства, где она используется). Подача "1" на <i>GPIO 7</i> <i>Raspberry Pi</i> приведет к срабатыванию оптодрайвера и открытию симистора <i>V2,</i> который начнет пропускать через себя ток, идущий от сети 220 В к силовой нагрузке. Прибор включается. Как только на <i>GPIO 7</i> возникает "0" - симистор <i>V2</i> закрывается и цепь нагрузки размыкается. Прибор выключается. Все просто!<br />
<br />
Применение же именно <i>Raspberry Pi</i> позволяет управлять нагрузкой программно, по расписанию, при наступлении каких-либо внешних событий или подаче сигналов (к примеру, сигнал с пульта для открытия ворот) и даже через Интернет (например, посредством собственного веб-сайта, работающего на том же <i>Raspberry)</i>. Одним словом, <i>Raspberry</i> помогает развивать фантазию.<br />
<br />
На этом все. В следующем посте о <i>Raspberry</i> постараюсь описать работу с <i>UART</i> и <i>SPI</i>.<br />
<br /></div>
</div>
hexvolthttp://www.blogger.com/profile/15234380228569938689noreply@blogger.com35tag:blogger.com,1999:blog-7592058636074739067.post-14738338649030015512013-01-04T14:36:00.000+02:002013-05-07T02:53:08.800+03:00Управление Raspberry Pi через SSH в Linux<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimxgB5T5DI6SwA247qOh6lHRcg84_fPtE-C6k2-AJhHInjicImKJ3ZTaSEY_AYb6lkoJQdGSUSdgsiMjqGRTbCLM7LCsEJ7RU9klo3Yt6kNK14i7rbyRIXBW_IlH7KcNb0IX0yHLpLVMI/s1600/raspberry_ssh_linux.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" />В большинстве проектов <i>Raspberry Pi</i> используется не в качестве полноценного настольного ПК, а в качестве сетевого мини-компьютера или устройства для управления различной электроникой (веб-камеры, <i>wi-fi</i> модули, <i>3G</i>-модемы, системы "умный дом" и пр.). Например, я в будущем планирую использовать его как веб-сервер, взаимодействующий с моим USB-устройством. Для подобной работы <i>Raspberry Pi</i> не требуется ни монитор, ни клавиатура. А подключать их каждый раз для программирования и настройки неудобно и хлопотно. Гораздо удобнее использовать для этих целей монитор и клавиатуру основного компьютера и работать с <i>Raspberry Pi</i> по локальной сети. Такое взаимодействие двух компьютеров реализуется с помощью специального сетевого протокола <a href="http://ru.wikipedia.org/wiki/SSH" target="_blank"><i>SSH</i></a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Итак, наша цель - получить возможность полноценной работы с <i>Raspberry Pi</i> через локальную сеть, причем так, как будто мы работаем непосредственно с самим мини-компьютером. Под катом - <b>как управлять <i>Raspberry Pi </i>через <i>SSH</i> в <i>Linux</i></b>.</div>
<a name='more'></a><div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
Исходное состояние</h3>
<div style="text-align: justify;">
<br />
К <i>Raspberry Pi</i> подключено всего два провода: сетевой кабель, соединяющий его с роутером, и шнур питания:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqcpVC-ytmLNZ6N_UmqFHRAVmUBUxgMt2fhguGP4fl9pSn6PXJrcRK0dR_vqIChkePipN1e0wTXVNV3umxHjSaIO95OajDdUi9j1RDaXR2GmBsUMOCtswIVkUYXDdu8H6cZ0wUtaz5nEs/s1600/raspberry1_s.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqcpVC-ytmLNZ6N_UmqFHRAVmUBUxgMt2fhguGP4fl9pSn6PXJrcRK0dR_vqIChkePipN1e0wTXVNV3umxHjSaIO95OajDdUi9j1RDaXR2GmBsUMOCtswIVkUYXDdu8H6cZ0wUtaz5nEs/s320/raspberry1_s.jpg" style="border: 1px solid black;" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
На <i>Raspberry Pi</i> включен <i>SSH</i>, номер порта <i>SSH</i> оставлен по умолчанию (22), автоматическая загрузка графической оболочки отключена. Имя пользователя и пароль также оставлены по-умолчанию (<i>pi</i> / <i>raspberry</i>). В локальной сети <i>Raspberry Pi</i> получил <i>ip</i>-адрес 192.168.1.35 (в настройках роутера я закрепил этот адрес за <i>Raspberry</i>, чтобы он впоследствии не изменился).</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: left;">
Что хотим?</h3>
<div style="text-align: justify;">
<br />
Используя главный компьютер, подключенный к локальной сети, хотим удаленно работать с <i>Raspberry Pi. </i>Причем работа с <i>Raspberry</i> по сети должна быть такой же, как и при непосредственном подключении к нему монитора и клавиатуры. Такое взаимодействие двух компьютеров реализуется с помощью протокола <i>SSH</i>. В <i>Linux</i> удаленно взаимодействовать с <i>Raspberry Pi</i> можно тремя способами:<br />
<br />
<b>1.</b> Работать с консолью <i>Raspberry</i> по сети;<br />
<b>2.</b> Удаленно запускать отдельные графические приложения так, чтобы работали они на <i>Raspberry</i>, а окно программы отображалось на мониторе главного ПК;<br />
<b>3.</b> Удаленно работать со всей графической оболочкой <i>Raspbian</i> по принципу удаленного рабочего стола. В этом случае монитор, клавиатура и мышь главного компьютера становятся монитором, клавиатурой и мышью <i>Raspberry Pi</i>.<br />
<br />
<h3>
1. Работа с консолью Raspberry Pi через SSH в Linux</h3>
<br />
Допустим, мы не желаем работать с графической оболочкой <i>Raspbian</i> и хотим просто получить доступ к консоли <i>Raspberry Pi</i>. В <i>Linux</i> (во всяком случае в дистрибутивах, основанных на <i>Ubuntu</i>) это делается очень просто - на главном компьютере открываем терминал и набираем всего одну команду:<br />
<br />
<span style="color: #990000;"> ssh pi@192.168.1.35</span><br />
<span style="font-size: x-small;"><b>Примечание:</b> в случае запроса аутентификации ответить <i>yes</i>.</span><br />
<br />
Этой командой мы устанавливаем связь по протоколу <i>SSH</i> с удаленным компьютером 192.168.1.35 и представляемся ему пользователем <i>pi</i>. После ввода пароля этого пользователя мы сразу получим доступ к консоли <i>Raspberry</i>, о чем будет свидетельствовать приветствие в командной строке:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUNiawJR_RuszOyoG8X35tgsA_BExqby3ZF85lOumpctHunQtVgxhFD6GyL_lBqZMkGLIzF0zhzTV4bB4K87JwKgqQpomnmq8-hmSRzfsycagrz9HVKKsmzhi5n_AL-UD8UmP-Iwxygck/s1600/raspberry_console.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="raspberry console linux" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUNiawJR_RuszOyoG8X35tgsA_BExqby3ZF85lOumpctHunQtVgxhFD6GyL_lBqZMkGLIzF0zhzTV4bB4K87JwKgqQpomnmq8-hmSRzfsycagrz9HVKKsmzhi5n_AL-UD8UmP-Iwxygck/s320/raspberry_console.jpg" title="" width="320" /></a></div>
<br />
С этого момента все, что мы видим и набираем в терминале равносильно тому, что мы набирали бы на клавиатуре, подключенной непосредственно к <i>Raspberry</i>.<br />
<br />
<h3>
2. Запуск графических приложений Raspberry Pi через SSH в Linux</h3>
<br />
Чтобы предлагаемые ниже решения были понятны, приведу сперва небольшое теоретическое отступление.<br />
В отличие от <i>Windows</i>, графический интерфейс в <i>Linux</i> основан на оконной системе <a href="http://ru.wikipedia.org/wiki/X_Window_System" target="_blank"><i>X Window System</i></a> (она же "иксы"). В двух словах ее "фишка" в том, что она имеет клиент-серверную архитектуру и позволяет выводить графический интерфейс не только локально работающих программ-клиентов, но и удаленных программ, работающих на других компьютерах. Именно эта особенность <i>X Widnow</i> позволяет программам в <i>Linux</i> выполняться на одном компьютере, а выводить графику - на другом (что нам и нужно). В случае с <i>Raspberry Pi</i> работа будет построена следующим образом:<br />
<br />
На главном компьютере с ОС <i>Linux</i> (например, <i>Ubuntu</i> или <i>Linux Mint</i>) уже работает <i>X</i>-сервер, занимающийся графическим интерфейсом всех запущенных программ (клиентов). Устанавливая <i>SSH</i>-соединение, <i>Raspbian</i> нужно сказать, чтобы в качестве <i>X</i>-сервера для отображения графики она использовала не свой сервер, а удаленный <i>X</i>-сервер главного ПК. Для этого в терминале главного компьютера набираем:<br />
<br />
<span style="color: #990000;"> ssh -X pi@192.168.1.35</span><br />
<b style="font-size: small;"><br />
</b> <b style="font-size: small;">Ключ <i>X</i></b><span style="font-size: x-small;"> заставляет перенаправлять данные графического интерфейса от <i>Raspberry</i> (192.168.1.35) на главный ПК через <i>SSH</i>-соединение (т. н. <i>X-Forwarding</i>).</span><br />
<br />
После установки соединения, как и в предыдущем разделе, мы получаем доступ к консоли <i>Raspberry Pi</i>, но теперь в случае запуска любого графического приложения <i>Raspberry </i>(например, файлового менеджера "<i>pcmanfm</i>"), его окно появится прямо на нашем рабочем столе.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieRVkq7tINqzB0k3GfvumVuJPtbUJ3QOPKzkkqh1bVuhMCxa3HQoXB-SHmy06sriELn8uEU5Bm3C4KqKDmjxqtMZyfinnPSOzv6Z2-M9klNZTJDEkrsKkjbVtafIwBIMHv79dmrTMEqtg/s1600/raspberry_xforwarding.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieRVkq7tINqzB0k3GfvumVuJPtbUJ3QOPKzkkqh1bVuhMCxa3HQoXB-SHmy06sriELn8uEU5Bm3C4KqKDmjxqtMZyfinnPSOzv6Z2-M9klNZTJDEkrsKkjbVtafIwBIMHv79dmrTMEqtg/s320/raspberry_xforwarding.jpg" style="border: 1px solid gray;" width="320" /></a></div>
<br />
Удобно.<br />
<br />
<h3>
3. Работа с графической средой Raspbian через SSH в Linux</h3>
<br />
Благодаря клиент-серверной архитектуре <i>X Window System</i>, в <i>Linux</i>-системах организовать "трансляцию" рабочего стола <i>Rasperry Pi</i> на другой компьютер наиболее просто и изящно. В этом разделе речь пойдет о том, как именно это лучше сделать и почему.</div>
<br />
<br />
<br />
<details><summary><b>Существующие решения</b></summary><br />
<div style="text-align: justify;">
Сперва хотелось бы сказать пару слов о разных способах подключения к рабочему столу <i>Raspberry</i>, которые часто попадаются в Интернете, и которые я считаю не оптимальными.<br />
<br />
<b>а)</b> Использование <i>VNC</i> для управления удаленным рабочим столом<br />
<i><a href="http://ru.wikipedia.org/wiki/Virtual_Network_Computing" target="_blank">VNC</a></i> - это кроссплатформенная система для графического управления удаленными рабочими столами. В интернете полно инструкций, как с помощью нее управлять рабочим столом <i>Raspbian</i>: для этого нужно установить на <i>Raspberry</i> <i>VNC</i>-сервер, на главный компьютер <i>VNC</i>-клиент или вьювер, правильно их настроить и т.д. <a href="http://elinux.org/RPi_VNC_Server" rel="nofollow" target="_blank">Инструкции по настройке</a> при этом могут представлять собой длинные простыни.<br />
Если для <i>Windows</i> такой способ может быть как-то полезен, то для <i>Linux</i>-системы и <i>Raspberry</i> смысла в нем я не вижу вообще. Зачем на <u>оба компьютера</u> ставить дополнительное ПО, если в самой концепции <i>Linux</i> "из коробки" уже заложена возможность трансляции графики на удаленный ПК? Поэтому отметаем этот способ, тем более, что не хотелось бы на <i>Raspberry</i> вносить какие-либо изменения только для удаленного управления. </div>
<br />
<b>б)</b> Использование вложенного <i>X</i>-сервера <i>Xephyr</i><br />
<div style="text-align: justify;">
<i>Xephyr</i> - это приложение для запуска в <i>Linux</i> вложенного <i>X</i>-сервера в отдельном окне. Устанавливается на главный ПК, после запуска появляется обычное окно заданного размера, в которое можно выводить графику от других приложений. Тонкости настроек расписывать не буду, перейдем сразу к резюме. Плюс такого решения хотя бы в том, что на <i>Raspberry Pi</i> не требуется ничего устанавливать. Однако и неудобств хватает: все же это дополнительное приложение, которое нужно устанавливать на главный компьютер, каждый раз отдельно запускать и указывать нужные настройки. Хотелось бы все же обойтись штатными средствами <i>Linux</i>.</div>
</details><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Оптимальное решение</b></div>
<div style="text-align: justify;">
Поскольку на главном ПК стоит <i>Linux</i>, то на нем (в дисплее 0) уже работает <i>X</i>-сервер, способный отображать графический интерфейс с удаленной машины. А значит, его можно заставить отображать всю графическую оболочку <i>Raspbian</i>. Действительно, если установить <i>SSH</i>-соединение между компьютерами с ключом <i>-X</i> и в консоли <i>Raspberry Pi</i> набрать "<span style="color: #990000;">startlxde</span>", то на главном ПК мы увидим удаленный рабочий стол <i>Raspbian</i>,<i> </i>полностью функциональный, но с некоторыми ошибками: рабочий стол и значки будут от <i>Raspberry</i>, а панель задач - от главного ПК. При этом нельзя будет переключаться между рабочими столами обеих машин. Такое поведение объясняется конфликтом оконных менеджеров двух компьютеров. Чтобы этого избежать, на главном ПК нужно запустить отдельную независимую сессию <i>X</i>-сервера <u>без оконного менеджера</u> на другом дисплее (под номером 1) и использовать запущенный <i>X</i>-сервер для отображения рабочего стола <i>Raspberry Pi</i>.</div>
<br />
<div style="text-align: justify;">
Для этого на главном ПК набираем в терминале:</div>
<div style="text-align: justify;">
<span style="color: #990000;"> sudo xinit -- :1</span></div>
<div style="text-align: justify;">
<b><br />
</b></div>
<div style="text-align: justify;">
<span style="font-size: x-small;"><b>Примечение:</b> для корректного выполнения этой команды в системе должен быть установлен терминал системы <i>X Window</i> - "<i>xterm</i>". Для его установки: <span style="color: #990000;">sudo apt-get install xterm</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Эта команда приведет к запуску на дисплее 1 отдельного <i>X</i>-сервера, в результате чего появится пустой экран с открытой консолью <i>xterm</i>:<br />
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhivFMgjr3W6oH20ilT9VJwHToxRPYc5SUpPtOU2Jcbl2qzMW3O0xewEj-zUnL7c0lhjLnsswlIeQJ_9hVXtbxk-jL6sl5jxoqWNLcVHVVibBRKUp4F6wMb3N5S81WbTi_S5LVp58ZzlyA/s1600/raspberry_xserver.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhivFMgjr3W6oH20ilT9VJwHToxRPYc5SUpPtOU2Jcbl2qzMW3O0xewEj-zUnL7c0lhjLnsswlIeQJ_9hVXtbxk-jL6sl5jxoqWNLcVHVVibBRKUp4F6wMb3N5S81WbTi_S5LVp58ZzlyA/s320/raspberry_xserver.jpg" style="border: 1px solid black;" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
В этой консоли набираем команду для <i>SSH</i>-соединения с <i>Raspberry Pi</i> и команду запуска графической оболочки:</div>
<div style="text-align: justify;">
<span style="color: #990000;"> ssh -X pi@192.168.1.35</span></div>
<div style="text-align: justify;">
<span style="color: #990000;"> startlxde</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
На экране появится удаленный рабочий стол <i>Raspberry Pi</i>, с которым можно полноценно работать так, как будто мы работаем непосредственно с самим мини-компьютером.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEileehEhzvWrsd5jTBUiAAwPo8Q5P4vbZLSp34IDCFISTNDW0DuSLkMBsdFRyRGIFBHDI8vG3y147kSTBc0tp6mxxq3AzY4CkrpigTHBSC6H-8zoNy81JCur2WcFXgeo2MoHKDro-eK_g0/s1600/respberry_desktop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEileehEhzvWrsd5jTBUiAAwPo8Q5P4vbZLSp34IDCFISTNDW0DuSLkMBsdFRyRGIFBHDI8vG3y147kSTBc0tp6mxxq3AzY4CkrpigTHBSC6H-8zoNy81JCur2WcFXgeo2MoHKDro-eK_g0/s320/respberry_desktop.jpg" style="border: 1px solid black;" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
</div>
<b style="font-size: small;">Примечание: </b><span style="font-size: x-small;">во время удаленной работы терминал </span><i style="font-size: small;">xterm</i><span style="font-size: x-small;"> нельзя закрывать, т.к. его закрытие приведет к завершению сеанса.</span></div>
<div style="text-align: justify;">
<br />
Для переключения между дисплеями (рабочим столом главного ПК и удаленным рабочим столом <i>Raspberry</i>) служат сочетания клавиш <i>Ctrl+Alt+F8</i>, <i>Ctrl+Alt+F9</i> (или <i>Ctrl+Alt+F7</i>, <i>Ctrl+Alt+F8</i> в зависимости от дистрибутива <i>Linux</i>).</div>
<div style="text-align: justify;">
Для завершения сеанса удаленного доступа достаточно закрыть терминал.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
В итоге мы получили полный удаленный доступ к <i>Raspberry Pi</i>, при этом не внося <u>никаких </u>изменений на <i>Raspberry</i>, не устанавливая и не настраивая на главном ПК никакого дополнительного софта. Предложенное решение позволяет максимально точно воспроизводить рабочий стол <i>Raspberry Pi</i> в полноэкранном режиме. При этом сохраняется возможность одновременной и независимой работы как с удаленным мини-компьютером, так и с главным ПК, переключая рабочие столы простым сочетанием клавиш.</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: left;">
Вместо выводов</h3>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
В качестве резюме приведу все вышеописанное, но без лишнего текста:</div>
<div style="text-align: justify;">
<b>1.</b> Работа с консолью <i>Raspberry Pi</i> через <i>SSH </i>в <i>Linux</i></div>
<div style="text-align: justify;">
<span style="color: #990000;"> ssh pi@192.168.1.35</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>2.</b> Запуск графических приложений <i>Raspberry Pi</i> через <i>SSH </i>в <i>Linux</i></div>
<div style="text-align: justify;">
<span style="color: #990000;"> ssh -X pi@192.168.1.35</span></div>
<div style="text-align: justify;">
<span style="color: #990000;"> имя_приложения</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>3.</b> Удаленный рабочий стол <i>Raspberry Pi</i> в <i>Linux </i><span style="font-size: x-small;">(загрузка оболочки на <i>Raspberry</i> предварительно отключена)</span><br />
<span style="font-size: x-small;"><br />
</span></div>
<div style="text-align: justify;">
<span style="color: #990000;">sudo xinit -- :1</span></div>
<div style="text-align: justify;">
<span style="color: #990000;"> ssh -X pi@192.168.1.35 </span>- набирать в открывшейся консоли <i>xterm</i></div>
<div style="text-align: justify;">
<span style="color: #990000;"> startlxde</span></div>
<br />
для переключения между рабочими столами - <i style="text-align: justify;">Ctrl+Alt+F8</i><span style="text-align: justify;">, </span><i style="text-align: justify;">Ctrl+Alt+F9</i><span style="text-align: justify;"> (или </span><i style="text-align: justify;">Ctrl+Alt+F7</i><span style="text-align: justify;">, </span><i style="text-align: justify;">Ctrl+Alt+F8</i><span style="text-align: justify;"> в зависимости от дистрибутива </span><i style="text-align: justify;">Linux</i><span style="text-align: justify;">).</span><br />
<span style="text-align: justify;"><br />
</span> <br />
<div style="text-align: justify;">
Все вышеописанное протестировано в <i>Linux Mint 13</i>, <i>Ubuntu 12.04, Ubuntu 13.04</i> и должно работать в других версиях <i>Linux</i>.</div>
<span style="text-align: justify;"><br />
</span></div>
hexvolthttp://www.blogger.com/profile/15234380228569938689noreply@blogger.com24tag:blogger.com,1999:blog-7592058636074739067.post-15068070247316922452013-01-04T14:00:00.002+02:002013-01-11T21:01:44.079+02:00Одноплатный мини-компьютер Raspberry Pi<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5sOg4gwmZYEVS2AEUgG5673eB1TnNZqPlXL-9WJwkSOO3WxWtmQ_8pflWNfv8jCUCf8L62puK0rFDt2xQYeT68MY9A0nEED9WWL9zYg4fs_c7Vb-361sG6MJpi06JBZdLxEt9oiz8aCQ/s1600/raspberry.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /></div>
<div style="text-align: justify;">
В канун Нового года получил одноплатный мини-компьютер <i>Raspberry Pi</i>. Что это такое и какая у него начинка описано <a href="http://ru.wikipedia.org/wiki/Raspberry_Pi" target="_blank">тут</a>. Несмотря на то, что этот компьютер очень маленький и очень дешевый, он имеет большие перспективы и приятно удивляет своими возможностями. Для меня лично <i>Raspberry Pi</i> - <strike>лакомый кусок.</strike> значимое звено, объединяющее в себе аккурат круг моих интересов:<br />
<br />
<ul>
<li><b>Электроника.</b> На борту находится <i>ARM</i>-процессор, есть возможность подключения разрабатываемых <i>USB</i>-гаджетов, есть отдельные выводы для подключения чего-угодно.</li>
<li><b><i>Linux</i> и веб-программирование.</b> Программное ядро <i>Raspberry Pi</i> - ОС <i>Linux (Debian)</i>. Задействовав сетевой разъем, можно вылепить из этого компьютера полноценный веб-сервер (что я и планирую сделать). </li>
<li><b>Прикладное программирование.</b> И конечно же можно писать программы практически на любом языке программирования (в том числе и прежде всего на <i>Python</i>), которые, к примеру, будут работать с подключенной электроникой.</li>
</ul>
<br />
Одним словом, возможностей тьма, хватило бы фантазии. Перейду к делу - в статье речь пойдет о том, где купить <i>Raspberry Pi</i>, что "в коробке", подробные фотографии и процесс его включения.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br />
<h3>
Где, как и почем купить Raspberry Pi.</h3>
<br />
Официальная стоимость <i>Raspberri Pi Model B</i> (на сегодняшний день это самая актуальная модель) - 35$. Однако в магазинах на полках он не валяется (видимо, ввиду большого спроса), поэтому "нельзя просто так взять и купить <i>Raspberry Pi</i>". Для себя я выделил три варианта приобретения <i>Raspberry</i>:</div>
<div style="text-align: justify;">
<br />
<b>1. Из-за бугра</b><br />
Это официальный путь и, как ни странно, относительно недорогой. Есть всего несколько контор - официальных продавцов <i>Raspberry</i>, все они перечислены на официальном сайте:<br />
<ul>
<li><i>Farnell</i> (Британия) <a href="http://downloads.element14.com/raspberryPi1.html?COM=raspi-group" target="_blank"><span style="font-size: x-small;">Купить <i>Raspberry Pi</i> на <i>Farnell</i></span></a></li>
</ul>
Судя по отзывам там часто компьютера нет в наличии, поэтому людям приходится ожидать его поступления на склад. Итоговая цена с учетом доставки (по опыту интернет-пользователей) ~ 50$.<br />
<ul>
<li><i>Newark</i> (США) <span style="font-size: x-small;"><a href="http://www.newark.com/raspberry-pi/raspbrry-modb-512m/model-b-assembled-board-only/dp/43W5302" target="_blank">Купить <i>Raspberry Pi</i> на <i>Newark</i></a></span></li>
</ul>
По сравнению с Farnell меньше проблем с наличием устройства на складах. Цена доставки может колебаться в широких пределах, в зависимости от перевозчика. Опыт покупки <i>Raspberry Pi</i> в США хорошо описан <a href="http://habrahabr.ru/post/152975/" target="_blank">на хабре</a>.<br />
<ul>
<li>Allied Electronics (США) <a href="http://www.alliedelec.com/lp/120626raso/" target="_blank"><span style="font-size: x-small;">Купить <i>Raspberry Pi</i> на <i>Allied Electronics</i></span></a></li>
</ul>
В списке дистрибьюторов появилась недавно, мне о ней ничего не известно.<br />
<ul>
<li>RS Components (Британия) <span style="font-size: x-small;"><a href="http://raspberrypi.rsdelivers.com/default.aspx" target="_blank">Купить <i>Raspberry Pi</i> на <i>RS Components</i></a></span></li>
</ul>
Тоже пока ничего не могу сказать, буду рад, если кто-то поделится опытом.<br />
<br />
<b>2. В отечественных магазинах</b><br />
<i>Raspberry Pi</i> также может быть в некоторых интернет-магазинах радиодеталей и компонентов. В Украине, например, <i>Raspberry</i> нашелся в магазинах <i>Imrad</i> и Космодром. Ссылки приводить даже не буду, т.к. его цена там превышает 800 грн. (больше 100$). За эти деньги можно купить <i>Raspberry</i> за рубежом, доставить его сюда и обратно, и на сдачу купить ящик пива. Поэтому никто у нас ничего не производит и не будет производить - зачем везти сюда детали с такими пошлинами и что-то делать, если можно их купить "за бугром" и там же все собрать. :-/<br />
<br />
<b>3. На аукционах или "с рук"</b><br />
А вот это, как по мне, один из самых привлекательных вариантов, и именно так ко мне попал <i>Raspberry Pi</i>. Купил я его на известном аукционе <i>aukro</i>, причем новый, запечатанный, с пломбами и наклейками и за 440 грн (~55$). С момента оплаты и до получения компьютера в руки прошло всего 4 дня. На подобных аукционах можно найти и б/у вариант в отличном состоянии даже за меньшие деньги.<br />
<br />
<h3>
Мини-обзор Raspberry Pi</h3>
Все было упаковано в ярком малиновом боксе:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw84-XIsk4m_tToJxzghKeR5cpF4eecxFJ16_WWI774akoROomNCMy97lTFms3_Nl5YCkf9gyfPwb5scPpMHUozQotmzHqx8cQOezHmgdq9OMSVKRmZPDSMmI4uy_aydbDqft5tQ_d854/s1600/RPi_intro_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi box" border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw84-XIsk4m_tToJxzghKeR5cpF4eecxFJ16_WWI774akoROomNCMy97lTFms3_Nl5YCkf9gyfPwb5scPpMHUozQotmzHqx8cQOezHmgdq9OMSVKRmZPDSMmI4uy_aydbDqft5tQ_d854/s400/RPi_intro_1.jpg" title="" width="400" /></a></div>
<br />
Внутри содержится антистатический пакет с <i>Raspberry Pi, </i>небольшая инструкция <i>Quick Start </i>и предупреждения о безопасном использовании компьютера:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfSHLuATzVc4CMp4zRJJg5w6jiEyZZYL0SBR0hqM8Pxn8gVqICsgPe4qDzucT9dyoY_TdUzbu-GutkAwyRFBeZIvT3KZkUFM_vaeaTLrkf2leGTizmwsOjAbZ2GFqrFF57GnP1ls1yvZM/s1600/RPi_intro_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi box inside" border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfSHLuATzVc4CMp4zRJJg5w6jiEyZZYL0SBR0hqM8Pxn8gVqICsgPe4qDzucT9dyoY_TdUzbu-GutkAwyRFBeZIvT3KZkUFM_vaeaTLrkf2leGTizmwsOjAbZ2GFqrFF57GnP1ls1yvZM/s400/RPi_intro_2.jpg" title="" width="400" /></a></div>
<br />
<i>Raspberry Pi Model B</i> за 35$ - это версия с минимальной комплектацией. Поэтому в комплекте нет ни карты памяти, ни источника питания, ни <i>HDMI</i>-кабеля - ничего кроме самого компьютера и инструкции:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOjIJvlEP4BcFNQkWqK9o9SJToqDLt6Mt4QxE-2hyphenhyphenygzjEGpbKYa8biUHVvckkB3WYQ1kZg_uxrqAuo9jAg1fBz2wt3yGR0Y7mwbeSLrN9WaYfvTvLYGBGWgmFB2UsuJeZ8TDzWbRwAAw/s1600/RPi_intro_4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi комплект" border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOjIJvlEP4BcFNQkWqK9o9SJToqDLt6Mt4QxE-2hyphenhyphenygzjEGpbKYa8biUHVvckkB3WYQ1kZg_uxrqAuo9jAg1fBz2wt3yGR0Y7mwbeSLrN9WaYfvTvLYGBGWgmFB2UsuJeZ8TDzWbRwAAw/s400/RPi_intro_4.jpg" title="" width="400" /></a></div>
<br />
Фотографии <i>Raspberry Pi</i> крупным планом - вид сверху:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgicCbw5jUs95mwvFfc7mfVI5vUqFOQ84ENXVC-uIfE9XgTEg0NN6eSQPmzP9GpVDjkGFz8NYD1SCClzG7JZYBuIvidtoyF9-GUkdq6Y-C3m6aLKZy8mpMJYstALALkbd8CZLoPlPh1fPI/s1600/RPi_intro_5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi вид сверху" border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgicCbw5jUs95mwvFfc7mfVI5vUqFOQ84ENXVC-uIfE9XgTEg0NN6eSQPmzP9GpVDjkGFz8NYD1SCClzG7JZYBuIvidtoyF9-GUkdq6Y-C3m6aLKZy8mpMJYstALALkbd8CZLoPlPh1fPI/s400/RPi_intro_5.jpg" title="" width="400" /></a></div>
<br />
И вид снизу:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjZeS8LEuFsM3MO2pSKe0qYIeb4ygw1MHcpFXQCqo9xEPUtRgZ30LC7T0pmjljj34BGjY-K76pljhuOLk0hUjN0tirFoXC341rKeeRHuQrw7iHOYa-4Y_Sih0GVzXzSmSI8FZN2fdP3iA/s1600/RPi_intro_6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Raspberry Pi вид снизу" border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjZeS8LEuFsM3MO2pSKe0qYIeb4ygw1MHcpFXQCqo9xEPUtRgZ30LC7T0pmjljj34BGjY-K76pljhuOLk0hUjN0tirFoXC341rKeeRHuQrw7iHOYa-4Y_Sih0GVzXzSmSI8FZN2fdP3iA/s400/RPi_intro_6.jpg" title="" width="400" /></a></div>
<br />
<br />
<h3>
Что понадобится для первого запуска</h3>
<br />
<b>1.</b> <b>Карта памяти</b> <i>SD</i> или <i>SDHC</i>. Список поддерживаемых карт приведен <a href="http://raspberrypi.rsdelivers.com/default.aspx" target="_blank">здесь</a>.<br />
<b>2.</b> <b>Картридер</b> для записи на карту образа операционной системы.<br />
<b>3.</b> <b>Источник питания</b> <i>5V @ 700mA</i> с разъемом <i>micro-USB</i>. Такой разъем предусмотрен специально для того, чтобы в качестве источника можно было использовать обычную зарядку от современного мобильного телефона.<br />
<b>4.</b> <b><i>HDMI</i>-кабель</b> для подключения к монитору или обычный <b><i>S-Video</i> кабель</b> для подключения к любому телевизору с композитным входом.<br />
<b>5.</b> <b><i>USB</i>-клавиатура</b> и <i>USB</i>-мышь (необязательна).<br />
<b>6.</b> <b>Сетевой кабель</b> для подключения <i>Raspberry Pi</i> к роутеру.<br />
<br />
Весь этот набор инструментов желателен для первого запуска <i>Raspberry Pi</i> и его первоначальной настройки. После этого в повседневной работе достаточно будет только карты памяти, сетевого кабеля и источника питания. Работать с <i>Raspberry Pi</i> без монитора и клавиатуры можно (и нужно) удаленно с другого компьютера посредством протокола <i>SSH</i>. Как это сделать я подробно описал в <a href="http://hexvolt.blogspot.com/2013/01/raspberry-pi-ssh-linux.html" target="_blank">следующей статье</a>.<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> есть информация, что новые версии ОС <i>Raspbian</i> (которые имеют свойство обновляються) настроены таким образом, чтобы мини-компьютером можно было сразу управлять по сети удаленно (по-умолчанию включен <i>SSH</i>-доступ). Это значит, что с новыми версиями ОС для начала работы с <i>Raspberry</i> монитор, клавиатура и пр. аксессуары даже не обязательны.</span><br />
<br />
<h3>
Первый запуск Raspberry Pi</h3>
<br />
На официальном сайте дана подробная инструкция в картинках по подготовке <i>Raspberry Pi</i> к работе. Чтобы не переписывать, вот она: <a href="http://www.raspberrypi.org/wp-content/uploads/2012/12/quick-start-guide-v1.1.pdf" target="_blank">pdf</a>.<br />
<br />
Основные действа, которые нужно сделать в меню <i>raspi-config</i> при первом запуске:<br />
- включить <i>SSH</i><br />
- заставить <i>Raspberry</i> использовать весь объем карты памяти (пункт меню "<i>expand_rootfs</i>")<br />
- отключить автоматическую загрузку рабочего стола для дальнейшей удаленной работы (пункт меню "<i>boot_behavior</i>")<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL2lPu5-gSj9yuxc0BFpxezDhw75ShZ1r3eqehCHoipLMU1whf5n27XvpQ-2QFWMDdxyrCPiS4Rtlg3XG5DWxfLBNR4xT1g49mW9mqpf-ODq3aDhGxMGuyisF_4avwy-GS44sPJ7kxBnQ/s1600/raspi-config.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="raspi-config" border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL2lPu5-gSj9yuxc0BFpxezDhw75ShZ1r3eqehCHoipLMU1whf5n27XvpQ-2QFWMDdxyrCPiS4Rtlg3XG5DWxfLBNR4xT1g49mW9mqpf-ODq3aDhGxMGuyisF_4avwy-GS44sPJ7kxBnQ/s400/raspi-config.jpg" style="border: 1px solid black;" title="" width="400" /></a></div>
<br />
<br />
<span style="font-size: x-small;"><b>Примечание:</b> если вы не изменили настройки при первом запуске, то повторно вызвать меню конфигурации <i>Raspberry Pi</i> можно, набрав в консоли:</span><br />
<span style="color: #990000; font-size: x-small;"> sudo raspi-config</span><br />
<br /></div>
<div style="text-align: justify;">
После перезагрузки изменения вступят в силу, после чего компьютер готов к удаленной работе, для которой будет достаточно карты памяти, сетевого шнура и источника питания.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
</div>
hexvolthttp://www.blogger.com/profile/15234380228569938689noreply@blogger.com0