Contrôle d’une LED sur un Raspberry avec le GPIO en Java
Le but final de cette partie de projet est de développer une interface Java pour piloter un robot. Après avoir fait le nécessaire au niveau des installations sur le Raspberry (voir page ici) et sur le PC Windows (voir page précédente), nous pouvons maintenant faire un premier test en essayant de contrôler en Java une LED qui est branchée au Raspberry sur un port GPIO.
Ce premier test nous familiarisera avec les notions principales que nous allons aborder dans ce projet.
Montage de la LED sur le GPIO du Raspberry
Nous allons donc dans un premier temps faire le montage d’une LED sur un Raspberry. Nous avons utilisé une LED branchée sur le port #18 du GPIO (pin numéro 12) avec une résistance de 330 Ohms entre la patte la plus longue de la LED et le Raspberry. La patte la plus courte de la LED est branchée sur la masse du Raspberry (GND : Ground). Le port GPIO du Raspberry est relié à la platine d’essai par une nappe.
Par exemple, la LED est branchée sur la pin numéro 12, elle est marquée d’un #18 (GPIO 18 (PCM_CLK)) sur notre T qui relie la platine à la nappe mais elle correspond au port numéro 01 de la librairie WiringPi.
Code en Java selon la méthode MVC pour controler le GPIO du Raspberry
Afin de commencer à coder, nous avons créé un projet « TestGPIOLibrairies » sur Eclipse. Nous y avons ajouté un package nommé « mvcRobot ». Ensuite, nous créons 4 classes selon la méthode MVC (voir page précédente) :
-
AppInterfaceLED.java
-
Controller.java
-
Robot.java
-
View.java
Ces 4 fichiers sont téléchargeables ci-dessous. L’archive contient les 4 fichiers au format java.
mvcRobot
4 files 2.44 KB 29/01/2021
Nous commençons le développement par la création de l’interface. Elle est facilitée par l’utilisation de l’extension WindowBuilder que nous avons installé sur Eclipse à partir du lien suivant » https://www.eclipse.org/windowbuilder/download.php ».
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
package mvcRobot; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Dimension; public class View { // View utilise Swing pour afficher interface utilisateur // définit les attributs : les composants de l'inteface private JFrame frame; // fenetre private JPanel contentPane; // panneau private JButton btnAllumerLed; // bouton private JButton btnEteindreLed; // bouton private JButton btnResetGPIO; // bouton private JLabel lblTexteTitre; // Champ de texte // Instanciation : constructeur de View public View(String title) { // paramétrage de la fenetre frame = new JFrame(title); frame.setResizable(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(1000, 350, 350, 300); frame.setVisible(true); // paramétrage du panneau contentPane = new JPanel(); frame.getContentPane().add(contentPane); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); // ajout des elements au panneau btnAllumerLed = new JButton("Allumer"); btnEteindreLed = new JButton("Eteindre"); btnResetGPIO = new JButton("Reset des ports GPIO"); lblTexteTitre = new JLabel("Branchez une LED sur le port #18 du GPIO"); lblTexteTitre.setPreferredSize(new Dimension(384, 50)); lblTexteTitre.setHorizontalAlignment(SwingConstants.CENTER); contentPane.setLayout(new BorderLayout(0, 0)); contentPane.add(btnAllumerLed, BorderLayout.WEST); contentPane.add(btnEteindreLed, BorderLayout.EAST); contentPane.add(btnResetGPIO, BorderLayout.SOUTH); contentPane.add(lblTexteTitre, BorderLayout.NORTH); } // methodes // on génère les getters et les setters pour chaque élément // getter permet de recuperer un element private avec une methode publique public JFrame getFrame() { return frame; } public JPanel getContentPane() { return contentPane; } public void setContentPane(JPanel contentPane) { this.contentPane = contentPane; } public JButton getBtnAllumerLed() { return btnAllumerLed; } public JButton getBtnEteindreLed() { return btnEteindreLed; } public JButton getBtnResetGPIO() { return btnResetGPIO; } public JLabel getLblTexteTitre() { return lblTexteTitre; } } |
Ensuite, nous passons à la classe Robot. Elle sera ici notamment constituée des attributs gpio et led18.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package mvcRobot; import com.pi4j.io.gpio.*; public class Robot { // attributs : elements du robot private GpioController gpio; private GpioPinDigitalOutput led18; // constructeur du robot public Robot(){ this.gpio = GpioFactory.getInstance(); this.led18 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01); } // méthodes public void allumerLed(GpioPinDigitalOutput led) { led.high(); } public void eteindreLed(GpioPinDigitalOutput led) { led.low(); } public void resetGPIO() { gpio.shutdown(); gpio.setState(false, led18); } public GpioPinDigitalOutput getLed18() { return led18; } } |
Il s’en suit la création classe Controller qui met en forme les actions sur les boutons par exemple.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package mvcRobot; public class Controller { // attributs private View view; private Robot robot; // constructeur public Controller(View v, Robot r) { view = v; robot = r; } // methodes // action des boutons public void initController() { view.getBtnResetGPIO().addActionListener(event -> robot.resetGPIO()); view.getBtnAllumerLed().addActionListener(event -> robot.allumerLed(robot.getLed18())); view.getBtnEteindreLed().addActionListener(event -> robot.eteindreLed(robot.getLed18())); } } |
Enfin, tout cela est coordonné dans un main.
Java
1 2 3 4 5 6 7 8 9 10 11 12 |
package mvcRobot; public class AppInterfaceLED { public static void main(String[] args) { // on assemble les pièces de la méthode MVC, ici RVC View fenetreInterface = new View("Interface de contrôle d'une LED avec GPIO en Java"); Robot raspiThermoCam = new Robot(); Controller controlActions = new Controller(fenetreInterface, raspiThermoCam); controlActions.initController(); } } |
Compilation et exécution du code Java
Maintenant, nous compilons le main sur Eclipse en l’exécutant, toujours sur le PC Windows. Evidemment, des erreurs apparaissent parce que ce fichier ne peut pas s’exécuter sur Windows sans les ports GPIO. Mais ce package apparait cette-fois dans le répertoire /bin du projet. En effet, les fichiers « .class » compilés sont ajoutés dans ce répertoire. Avec WinSCP, nous transférons le dossier du package compilé sur le Raspberry. Il ne nous reste plus qu’à lancer le programme avec la commande suivante :
Terminal
1 2 |
cd /home/pi/ # on se place dans le répertoire qui contient le package bin sudo java -classpath .:classes:/opt/pi4j/lib/'*' mvcRobot.AppInterfaceLED # commande pour exécuter le package via le main et en utilisant les librairies Pi4J |
Le résultat de ce premier test est visible sur la vidéo ci-dessous :
Nous pouvons donc commencer le développement de notre application Java pour piloter un robot et afficher le contenu d’une caméra thermique placée à l’avant.