Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
piP

pi

@pi
Сводка
Сообщения
6.3k
Темы
1.6k
Группы
1
Подписчики
0
Подписки
0

Сообщения

Последние Лучшие сообщения Спорные

  • GPIO для чайников (часть 1)
    piP pi

    попробуйте перед ./GPIO-test добавить sudo, должно помочь


  • GPIO для чайников (часть 1)
    piP pi

    При запуске ./GPIO-test выдается следующая ошибка bcm2835_init: Unable to open /dev/mem: Permission denied
    в каталоге dev ни папки ни файла mem нету, куда копать?
    Спасибо!


  • GPIO для чайников (часть 1)
    piP pi

    Все, понял свою ошибку.


  • GPIO для чайников (часть 1)
    piP pi

    Правильно ли я понимаю, что для того чтобы включить светодиод аналогично тому как он включен в статье, но для ревизии 2.0, необходимо использовать не третий пин, а второй?

    #define PIN RPI_V2_GPIO_P1_02

    Ну если верить вот этой распиновке: http://www.raspberrypi-spy.co.uk/wp-content/uploads/2012/09/Raspberry-Pi-GPIO-Layout-Revision-2.png


  • GPIO для чайников (часть 1)
    piP pi

    А у вас какая версия RPI?
    Если V2, то читайте решение внизу у автора ASA.


  • GPIO для чайников (часть 1)
    piP pi

    В общем, что бы исспользовать пин P1-03 в платах ревизии 2 надо дописывать V2 в объявлении пина
    #define PIN RPI_GPIO_P1_03
    должно быть так
    #define PIN RPI_V2_GPIO_P1_03


  • GPIO для чайников (часть 1)
    piP pi

    похоже болезнь должна вылечиться обновлением библиотеки для работы с GPIO(по крайней мере в ченжлоге есть упоминания о изменениях для второй редакции платы)
    http://www.open.com.au/mikem/bcm2835/bcm2835-1.14.tar.gz
    не плохо было бы если статью подправили


  • GPIO для чайников (часть 1)
    piP pi

    Было бы хорошо если бы автор поста пролил свет на эту тему. тоже новая малинка и тоже самое с этими пинами, может их надо как то переназначить? хотя признаюсь подозрение на то что мог их коротнуть на 5V имееются %) и на душе как то не спокойно 🙂


  • GPIO для чайников (часть 1)
    piP pi

    Я в этом GPIO чайник 🙂 ... купил малину для CarPC ну и начал интересеваться им. Для начала собрал пример это и ни 01 ни 03 не горят. 🙂 хотя я его вольтметром счупаю взамест светодиода. Мобыть сгорело ? ан нет.
    установил софтинку http://code.google.com/p/webiopi/ и оказывается эти 01 и 03 совсем не для того предназначены :=. Мобыть из за того что у меня версия малины не та, что у автора, а вот на 07 начал напрюжометр скакать яки положено.
    спасибо автор - не зря писал 🙂


  • GPIO для чайников (часть 1)
    piP pi

    Вот проделал тоже самое, и не работает. точнее установил библиотеку, код компиллится без ошибок, но когда запускаешь, на порт ничего... смотрел даже примеры из bcm2835 , не работает и все. сама программа точнее работает, а порты нет. Кто знает, в чем еще может быть дело?


  • GPIO для чайников (часть 1)
    piP pi

    Спасибо большое, за проделанную работу! Я про написание туториала.


  • GPIO для чайников (часть 1)
    piP pi

    Спасибо решено!

    1. длинные тире это зло программа отказывалась собираться с длинными тире
    2. при копировани добовляет лишнии строки и прочии не нужные пробелы их я поудалял

  • GPIO для чайников (часть 1)
    piP pi
    pi@raspberrypi ~/bcm2835-1.8/myprog $ sudo gcc –o GPIO-test GPIO-test.c –l bcm2835
    gcc: error: –o: No such file or directory
    gcc: error: GPIO-test: No such file or directory
    gcc: error: –l: No such file or directory
    gcc: error: bcm2835: No such file or directory
    

    Помогите не хочет компилится


  • GPIO для чайников (часть 1)
    piP pi

    почему-то не хочет компилировать

    gcc -o GPIO-test GPIO-test.c -l bcm2835
    /usr/local/lib/libbcm2835.a(bcm2835.o): In function `bcm2835_delayMicroseconds':
    /home/pi/bcm2835-1.11/src/bcm2835.c:342: undefined reference to `clock_gettime'
    /home/pi/bcm2835-1.11/src/bcm2835.c:352: undefined reference to `clock_gettime'
    collect2: ld returned 1 exit status
    

  • GPIO для чайников (часть 1)
    piP pi

    А вот я в "железной микроэлектронике" - чайник. И меня это очень заинтересовало.
    Спасибо!


  • GPIO для чайников (часть 1)
    piP pi

    Ну я в своё время неплохо разобрался со всем этим на примере mini6410 http://www.friendlyarm.net/products/mini6410
    Raspberry Pi пока до меня не дошла. Как придёт обязательно напишу, что-нибудь интересное


  • GPIO для чайников (часть 1)
    piP pi

    Mike, ну вобще-то я это совсем для чайников писал. Раз уж вас интересуют uart,i2c,spi, то вы к этой категории вряд-ли относитесь. Но, как минимум, про UART я точно что-нить напишу, т.к. это для меня актуально (есть в наличии железки, которые просятся на это дело). Но это вряд-ли получится быстро. С начала я сам должен с юартом наиграться, чтобы достаточно уверенно с ним работать. Так что если вы сами уже обладаете какими то наработками- не стесняйтесь делиться ими со всеми 😉
    А в следующей части продолжим со светодиодом разбираться, т.к. он под управлением Raspberry способен на гораздо большее, чем просто гореть. 🙂


  • GPIO для чайников (часть 1)
    piP pi

    В следующих частях про GPIO что планируется?
    uart,i2c,spi?


  • GPIO для чайников (часть 1)
    piP pi

    Отлично расписано.
    Для ленивых тоже есть способ зажечь светодиод )

    echo 1 >  /sys/class/gpio/gpioN/direction
    echo 1 >  /sys/class/gpio/gpioN/value
    

  • Удаленное управление. Поймаем кнопку за событие.
    piP pi

    И снова вечер и снова делать нечего.

    А вот например GPIO. Тут один товарищ описал что такое GPIO в серии статей GPIO для чайников. Из них мы знаем, что GPIO может работать как на вход, так и на выход. Грубо говоря, если я замкну 2 пина, один из которых будет IN, а второй OUT и поменяю значение второго, то значение первого так же изменится. Думаю, схему подобного приводить не стоит, потому что, фактически, это просто соединение прямым проводом двух пинов.

    Теперь мысль дальше. Вместо прямого провода мы можем соединить 2 пина кнопкой. Нажимаем кнопку - пины замыкаются, значение IN меняется, отпускаем...ну и так далее. Я соединил кнопкой 2 пина: GPIO3 и GPIO4. Получилась вот такая вот схемка.

    Другой, более удобной кнопки у меня, к сожалению нет. Ну да ладно. Осталось только понять когда кнопка нажата, а когда наоборот.

    Теперь обратимся к ferro-remote, программке, которую я описывал тут. Можно, например, для нее написать скрипт, который покажет текущее состояние пина 4:

    g = fr.client.gpio.export(4, "in") 
    print(g:get( ))
    

    Все. Данный скрипт запросит состояние пина и выведет его в консоль.

    Малинка висит на 192.168.1.11:12345

    сохраним файл как gpio.lua. Запускаем:

    $ ./lua_client -s 192.168.1.11:12345 -e gpio.lua 
    0
    

    Кнопка отжата. Нажимаем, и запускаем снова

    $ ./lua_client -s 192.168.1.11:12345 -e gpio.lua 
    1
    

    Ура! Работает!

    Но как-то странно все это. Для того, чтоб понять, что сейчас в значении у GPIO4 я вынужден делать удаленный вызов (sick!) с довольно приличной частотой (sick! sick!), чтоб хоть как-то адекватно среагировать на событие. А если клиентов штук 50?

    Но, у нас же есть система Linux на raspberry, которая ЗНАЕТ, когда изменилось состояние пина. У GPIO есть такое свойство, имя которому

    EDGE.
    EDGE может принимать 4 значения:

    • none: не реагировать на изменения
    • rising: реагировать только на "подъем" пина
    • falling: реагировать только на "сброс" пина
    • both: реагировать на оба события

    Тут стоит сделать примечание, что не все пины поддерживают данное свойство. Пишу к тому, что у меня есть аналог малинки, на котором из 30 GPIO edge поддерживают только 7.

    В lua_client есть возможность подписаться на данное событие. В контексте самого клиента оно называется on_changed.

    подписка происходит методом subscribe объекта gpio. Например:

    gpio = fr.client.gpio -- алиас для удобства
    
    function value_changed( data ) -- функция-обработчик события
        print( "Value 3 -> 4 has changed to", data.value ) -- текущее состояние выведем
    end
    
    function main(  )
    
        local gin, erri  = gpio.export( 4, "in" ) -- получим 4 для ввода
        local gout, erro = gpio.export( 3, "out" ) -- получим 3 для вывода
    
        if gin and gout then 
    	fr.run( ) -- специальная функция, которая говорит клиенту 
                      -- не завершать работу после функции main, а ждать событий
    	assert(gout:set(0)) -- установим значение пина 3 на 0
    	assert(gin:set( "edge", "both" )) -- установим значение edge пина 4 на both
    	assert(gin:subscribe("on_changed", value_changed, gin )) -- подпишемся, 
                                                                     -- "запомним" gin, чтоб он не был прибит GC 
        else
    	print( erri, erro )  -- что-то пошло не так, просто выведем ошибки
        end
    end
    

    Сохраним, выполним:

    $ ./lua_client -s 192.168.1.11:12345 -e gpio.lua 
    Value 3 -> 4 has changed to	0
    Value 3 -> 4 has changed to	1
    Value 3 -> 4 has changed to	1
    Value 3 -> 4 has changed to	1
    Value 3 -> 4 has changed to	0
    Value 3 -> 4 has changed to	0
    

    Ну прям песня! Теперь я не закидываю малинку запросами с вопросом о состоянии, система сама генерирует событие и присылает мне новое! Процессор на 0, трафик на 0. События.

    Кстати, если посмотреть внимательно, то можно заметить, что подряд идут одинаковые значения. Я точно не помню как подобный эффект называется, но суть его в том, что пока я нажимаю на кнопку, она в реальности успевает несколько раз законтачиться и расконтачиться. Система на это все реагирует генерацией события. Чем качественнее кнопка, тем меньше таких вот косяков. У меня - очень некачественная.

    Теперь, чтоб было еще интереснее, повесим на GPIO2 диод, как было описано в GPIO для чайников (часть 1) и переделаем немного скрипт, чтоб он устанавливал пину 2 состоние пина 4, когда то изменится.

    Итого. Тот же самый скрипт, только добавил открытие GPIO2 и изменение его состояние по изменению GPIO4

    gpio = fr.client.gpio
    
    function value_changed( data, diod )
        print( "Value 3 -> 4 has changed to", data.value, data.interval )
        diod:set( data.value ) -- установим состояние диода.
    end
    
    function main(  )
    
        local gin, erri  = gpio.export( 4, "in" )
        local gout, erro = gpio.export( 3, "out" )
        local diod, errd = gpio.export( 2, "out" ) -- откроем диод
    
        if gin and gout and diod then 
    	fr.run( )
    	assert(gout:set(0))
    	assert(gin:set( "edge", "both" ))
    	assert(gin:subscribe("on_changed", value_changed, diod, gin ))
        else
    	print( erri, erro, errd )  
        end
    end
    

    Теперь скрипт включает и выключает диод, когда я нажимаю или отжимаю кнопку.

    PS: Где-то у меня инкрементный енкодер валялся. Думаю, если я его найду, то добавлю пример работы с ним.

  • 1 / 1
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи