Note
Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l’univers des Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi rejoindre ?
Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.
Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.
Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
Réductions spéciales : Profitez de réductions exclusives sur nos produits les plus récents.
Promotions festives et cadeaux : Participez à des cadeaux et des promotions de vacances.
👉 Prêt à explorer et à créer avec nous ? Cliquez [Ici] et rejoignez-nous aujourd’hui !
2.1.7 Potentiomètre
Note
Selon la version de votre kit, identifiez si vous disposez d’un ADC0834 ou d’un MCP3008 et suivez la section correspondante.
Introduction
La fonction ADC peut être utilisée pour convertir des signaux analogiques en signaux numériques, et dans cette expérience, l’ADC0834 est utilisé pour obtenir cette fonction impliquant l’ADC. Ici, nous mettons en œuvre ce processus en utilisant un potentiomètre. Le potentiomètre change la quantité physique – la tension, qui est convertie par la fonction ADC.
Composants Nécessaires
Dans ce projet, nous avons besoin des composants suivants.
Il est définitivement pratique d’acheter un kit complet, voici le lien :
Name |
ITEMS IN THIS KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Vous pouvez également les acheter séparément aux liens ci-dessous.
INTRODUCTION DES COMPOSANTS |
LIEN D’ACHAT |
|---|---|
- |
Schéma de Câblage
Procédures Expérimentales
Étape 1: Construisez le circuit.
Note
Veuillez placer la puce en vous référant à la position correspondante décrite dans l’image. Notez que les rainures sur la puce doivent être à gauche lorsqu’elle est placée.
Étape 2: Ouvrez le fichier de code.
cd ~/raphael-kit/c/2.1.7/
Étape 3: Compilez le code.
gcc 2.1.7_Potentiometer.c -lwiringPi
Étape 4: Exécutez le programme.
sudo ./a.out
Après l’exécution du code, tournez le bouton du potentiomètre, l’intensité de la LED changera en conséquence.
Note
Si cela ne fonctionne pas après l’exécution, ou s’il y a un message d’erreur : "wiringPi.h: No such file or directory", veuillez vous référer à Installer et vérifier WiringPi.
Code
#include <wiringPi.h>
#include <stdio.h>
#include <softPwm.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
#define LedPin 3
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Select
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
uchar analogVal;
if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
printf("setup wiringPi failed !");
return 1;
}
softPwmCreate(LedPin, 0, 100);
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
analogVal = get_ADC_Result(0);
printf("Current analogVal : %d\n", analogVal);
softPwmWrite(LedPin, analogVal);
delay(100);
}
return 0;
}
Explication du Code
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
#define LedPin 3
Définir CS, CLK, DIO de l’ADC0834, et les connecter respectivement à GPIO0, GPIO1 et GPIO2. Ensuite, attacher la LED à GPIO3.
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Select
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;
}
Il existe une fonction de l’ADC0834 pour effectuer la conversion analogique-numérique. Le flux de travail spécifique est le suivant :
digitalWrite(ADC_CS, 0);
Mettre CS à un niveau bas et commencer à activer la conversion AD.
// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
Lorsque la transition de l’horloge d’un niveau bas à un niveau haut se produit pour la première fois, régler DIO sur 1 comme bit de démarrage. Dans les trois étapes suivantes, il y a 3 mots d’affectation.
//Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
Dès que la transition de l’horloge d’un niveau bas à un niveau haut se produit pour la deuxième fois, régler DIO sur 1 et choisir le mode SGL.
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
Une fois que cela se produit pour la troisième fois, la valeur de DIO est contrôlée par la variable odd.
//Select
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
Lorsque l’impulsion de CLK passe du niveau bas au niveau haut pour la quatrième fois, la valeur de DIO est contrôlée par la variable sel.
Dans le cas où channel=0, sel=0, odd=0, les formules opérationnelles concernant sel et odd sont les suivantes :
int sel = channel > 1 & 1;
int odd = channel & 1;
Lorsque la condition channel=1, sel=0, odd=1 est remplie, veuillez vous référer au tableau de logique de contrôle d’adresse suivant. Ici, CH1 est choisi, et le bit de démarrage est décalé dans l’emplacement de démarrage du registre de multiplexage et la conversion commence.
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
Ici, définir DIO sur 1 deux fois, veuillez l’ignorer.
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
Dans la première instruction for(), dès que la cinquième impulsion de CLK passe du niveau haut au niveau bas, régler DIO en mode entrée. Ensuite, la conversion commence et la valeur convertie est stockée dans la variable dat1. Après huit périodes d’horloge, la conversion est terminée.
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
Dans la deuxième instruction for(), les valeurs converties sont sorties via DO après huit autres périodes d’horloge et stockées dans la variable dat2.
digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;
return(dat1==dat2) ? dat1 : 0 est utilisé pour comparer la valeur obtenue lors de la conversion et la valeur de sortie. Si elles sont égales, la valeur convertie dat1 est sortie ; sinon, 0 est sorti. Ici, le flux de travail de l’ADC0834 est terminé.
softPwmCreate(LedPin, 0, 100);
La fonction est d’utiliser un logiciel pour créer une broche PWM, LedPin, puis la largeur d’impulsion initiale est définie sur 0, et la période du PWM est de 100 x 100us.
while(1){
analogVal = get_ADC_Result(0);
printf("Current analogVal : %d\n", analogVal);
softPwmWrite(LedPin, analogVal);
delay(100);
}
Dans le programme principal, lire la valeur du canal 0 qui a été connecté à un potentiomètre. Et stocker la valeur dans la variable analogVal puis l’écrire dans LedPin. Vous pouvez maintenant voir la luminosité de la LED changer en fonction de la valeur du potentiomètre.
Image du Phénomène