Le contenu de l'article de M. Kuwano dans "Chapitre 4 Essayer de déplacer un circuit externe par entrée de commande" dans "** E / S d'ordinateur Easy ARM avec Raspberry Pie **" (Interface Special Edition 2013 CQ Publisher) A l'automne 2020, j'ai confirmé l'opération sur Ubuntu 18.04
[^ 1]. Le contenu de l'article est très facile à comprendre et l'explication est polie et facile à comprendre, mais comme il est basé sur l'utilisation de raspbian
dans l'article au moment de 2013, le travail de désactivation du paramètre SPI sur GPIO pour fonctionner sur Ubuntu
En outre, certaines des conceptions de circuits introduites doivent être modifiées et j'écrirai un mémo du contenu du travail et des modifications dans un article pour organiser ma compréhension.
[^ 1]: Personnellement, je prévois d'apprendre ROS
à l'avenir, donc c'est un travail qui a eu lieu après avoir choisi ubuntu
comme système d'exploitation, ce qui facilite l'installation de ROS
, donc bien sûr, raspbian Si c'est
, même dans la dernière version, raspi-config
est dans le réglage initial, donc il n'y a pas de travail à faire pour l'utiliser.
Vous trouverez ci-dessous un lien vers le schéma du circuit de référence [^ 2] et une photo de l'appareil réellement réalisé [^ 3]. --UNE CARTE DE TEST DE LED À 7 CHIFFRES "Schéma de circuit" [^ 2]: Le circuit de l'appareil réellement réalisé est "[Programmation du pilote de périphérique ARM apprise avec Raspberry Pi](https://www.socym.co.jp/support/s-940" Satoshi Yoneda 2014 Sosim "" ) »(Satoshi Yoneda 2014 Sosim) Il s'agit d'une conception légèrement modifiée utilisant la LED à 7 segments et 74HC4511 à la page 47. Les points de correction sont que la borne DP est directement connectée à GPIO11 via une résistance (510Ω) pour le contrôle, et une résistance de rappel de 10k ohms est utilisée comme indiqué dans le circuit «E / S de tarte aux framboises». Le seul point est que nous avons ajouté deux interrupteurs poussoirs. La connexion à GPIO pour le contrôle des commutateurs utilise «GPIO2» et «GPIO3» de «J8 GPIO». [^ 3]: À l'exception du circuit intégré et de la carte universelle, la plupart des déchets que j'avais à la maison sont réutilisés, et parce que j'ai fait une erreur dans le câblage et mis et éteint le câblage plusieurs fois, le câblage et la fabrication sont compliqués, mais pour le moment Fonctionne comme indiqué.
Premièrement, l'interface GPIO dans le répertoire / sys
existe déjà avec les paramètres par défaut.
~$ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Jan 1 1970 export
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpiochip0 ->
../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Jan 1 1970 gpiochip504 -> ../../devices/platform/soc/soc:firmware/soc:firmware:expgpio/gpio/gpiochip504
--w------- 1 root root 4096 Jan 1 1970 unexport
Mais quand j'essaye de créer un lien symbolique pour une broche GPIO7
, je suis grondé comme" le périphérique ou la ressource est occupé et une erreur d'écriture d'écho ".
~$ sudo -s
~# echo 7 >/sys/class/gpio/export
bash: echo: write error: Device or resource busy
Par défaut, les broches GPIO7
et GPIO8
étaient définies pour SPI [^ 4].
~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-53, parent: platform/3f200000.gpio, pinctrl-bcm2835:
gpio-7 ( |spi0 CS1 ) out hi ACTIVE LOW
gpio-8 ( |spi0 CS0 ) out hi ACTIVE LOW
gpio-29 ( |led0 ) out lo
~# exit
[^ 4]: Comme vous pouvez le voir sur l'image de l'appareil ci-dessus, le nombre «3» s'affiche automatiquement à la mise sous tension. «3» est affiché dans «74HC3411» car «GPIO7» et «GPIO8» sont «H» dans le schéma de circuit, ainsi SPI peut être utilisé par défaut lorsque le circuit est connecté à GPIO. Vous pouvez imaginer que c'est le cas, mais c'est très pratique si vous pouvez le vérifier avec une commande.
J'ai utilisé raspi-config pour définir la fonction GPIO. Bien qu'il s'agisse d'un outil de changement de paramètre dédié à raspbian, il a été introduit qu'il fonctionne avec l'URL suivante même dans ubuntu, j'ai donc travaillé selon la procédure introduite.
sudo echo "deb http://archive.raspberrypi.org/debian/ jessie main" >> /etc/apt/sources.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7FA3303E
sudo apt-get update
sudo apt-get install raspi-config
sudo mount /dev/mmcblk0p1 /boot
Vous pouvez maintenant lancer normalement l'écran de menu de l'interface graphique raspi-config.
~$ sudo rapsi-config
Depuis l'écran du menu supérieur de rapsi-config, sélectionnez "** 5 Options d'interfaçage Configurer les connexions aux périphériques "> " P4 SPI Activer / Désactiver le chargement automatique du module noyau SPI ". Après cela, si vous sélectionnez " Non " dans " Voulez-vous que l'interface SPI soit activée? ", le message " L'interface SPI est désactivée " s'affichera sous la forme " Ok ". Appuyez sur "" pour revenir à l'écran supérieur, alors enregistrez simplement vos modifications avec " Terminer **" à la fin.
~$ sudo reboot -h now
Après le redémarrage pour charger les modifications de configuration, vérifiez à nouveau l'état de la configuration GPIO.
~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-53, parent: platform/3f200000.gpio, pinctrl-bcm2835:
gpio-29 ( |led0 ) out lo
gpiochip1: GPIOs 504-511, parent: platform/soc:firmware:expgpio, raspberrypi-exp-gpio, can sleep:
gpio-506 ( |led1 ) out lo ACTIVE LOW
Si GPIO7 et 8 disparaissent de la liste, vous réussissez. Si cela ne fonctionne pas, il est possible que les modifications de raspi-config
n'aient pas été enregistrées.
Le but de ce travail est de créer un environnement d'exécution pour les tests de circuits de périphériques d'apprentissage de pilotes de périphériques GPIO. En d'autres termes, la vérification finale consistait à exécuter le code de script shell suivant et à vérifier les erreurs de câblage sur le circuit.
Aucune erreur ne s'est produite sur la ligne de commande, et même dans le test de la machine réelle, le nombre de 0 à 9 était affiché sur la LED à 7 segments après que le point ait clignoté deux fois, et le point a clignoté deux fois avant de se terminer.
Lorsque le bouton-poussoir est ouvert, «1» s'affiche sur l'écran de la console et lorsque le bouton est enfoncé, «0» s'affiche.
Le placement des numéros GPIO a légèrement changé depuis l'époque de "I / O with Raspberry Pie". Dans ce circuit expérimental, les positions physiques des broches de l'interrupteur à poussoir sont les mêmes que les numéros conventionnels 3 et 5, de sorte que le numéro GPIO est changé de la combinaison de "" 0 "et" 1 "" à "" 2 "". Il est changé par programme en la combinaison de "3" ".
gpio_sh
echo gpio export pin seting ...
echo 2 > /sys/class/gpio/export
echo 3 > /sys/class/gpio/export
echo 7 > /sys/class/gpio/export
echo 8 > /sys/class/gpio/export
echo 9 > /sys/class/gpio/export
echo 10 > /sys/class/gpio/export
echo 11 > /sys/class/gpio/export
echo gpio pin direction seting ...
echo in > /sys/class/gpio/gpio2/direction
echo in > /sys/class/gpio/gpio3/direction
echo out > /sys/class/gpio/gpio7/direction
echo out > /sys/class/gpio/gpio8/direction
echo out > /sys/class/gpio/gpio9/direction
echo out > /sys/class/gpio/gpio10/direction
echo out > /sys/class/gpio/gpio11/direction
echo gpio test start...
echo 1 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 1 > /sys/class/gpio/gpio10/value
echo 1 > /sys/class/gpio/gpio11/value
echo 1 > /sys/class/gpio/gpio11/value
sleep 1
echo 0 > /sys/class/gpio/gpio11/value
sleep 1
echo 1 > /sys/class/gpio/gpio11/value
sleep 1
echo 0 > /sys/class/gpio/gpio11/value
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 0
sleep 1
echo 1 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 1
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 2
sleep 1
echo 1 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 3
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 1 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 4
sleep 1
echo 1 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 1 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 5
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 1 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 6
sleep 1
echo 1 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 1 > /sys/class/gpio/gpio9/value
echo 0 > /sys/class/gpio/gpio10/value
echo 7
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 1 > /sys/class/gpio/gpio10/value
echo 8
sleep 1
echo 1 > /sys/class/gpio/gpio7/value
echo 0 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 1 > /sys/class/gpio/gpio10/value
echo 9
sleep 1
echo 0 > /sys/class/gpio/gpio7/value
echo 1 > /sys/class/gpio/gpio8/value
echo 0 > /sys/class/gpio/gpio9/value
echo 1 > /sys/class/gpio/gpio10/value
echo 1 > /sys/class/gpio/gpio11/value
echo dot
sleep 1
echo 0 > /sys/class/gpio/gpio11/value
sleep 1
echo 1 > /sys/class/gpio/gpio11/value
sleep 1
echo 0 > /sys/class/gpio/gpio11/value
sleep 1
echo 1 > /sys/class/gpio/gpio11/value
cat /sys/class/gpio/gpio2/value
cat /sys/class/gpio/gpio3/value
echo test exiting...
echo 2 > /sys/class/gpio/unexport
echo 3 > /sys/class/gpio/unexport
echo 7 > /sys/class/gpio/unexport
echo 8 > /sys/class/gpio/unexport
echo 9 > /sys/class/gpio/unexport
echo 10 > /sys/class/gpio/unexport
echo 11 > /sys/class/gpio/unexport
echo end
En préparation de l'expérience de création de pilote de périphérique, nous avons introduit raspi-config pour vérifier l'opération aussi simple que possible. Dans le fichier / sys / kernel / debug / gpio
, gpiochip0: GPIOs 0-53, parent: platform / 3f200000.gpio, pinctrl-bcm2835
est écrit et l'adresse SOC GPIO est de 3f200000. Sachant que cela est également mentionné ici, c'est une expérience simple, mais Linux est devenu encore plus familier.
Ensuite, je voudrais expérimenter comment utiliser le pilote de périphérique GPIO en langage C et comment accéder directement au registre.
Recommended Posts