Alimentation de Poche Programmable Compacte avec Affichage OLED – Compatible Arduino
Composants et fournitures
| Arduino UNO | × | 1 |
| Arduino Nano R3 | × | 1 |
| Module Boost DC-DC XL6009 | × | 1 |
| Interrupteur Poussoir 12mm (SparkFun) | × | 1 |
| Quartz 16 MHz | × | 1 |
| Bornier | × | 1 |
| Régulateur Linéaire à Sortie Réglable | × | 1 |
| Régulateur Linéaire 7805 | × | 1 |
| Diode 1N4007 – Haute Tension, Haut Courant | × | 1 |
| Câble USB-A vers B | × | 1 |
| Potentiomètre Précision Multi-tours 10k ohms (25 tours) | × | 1 |
| Relais à Verrouillage Arduino 5V 2A | × | 1 |
| Potentiomètre Numérique MCP4131 10k (SparkFun) | × | 1 |
| Ruban Cuivre Arduino | × | 1 |
| Amplificateur Opérationnel LM358 | × | 1 |
| Amplificateur Opérationnel OP07 (Instrumentation) | × | 1 |
| Boîtier Prise Standard | × | 1 |
| Plaque Proto FR4 | × | 1 |
| Fils de connexion (générique) | × | 1 |
| Connecteur Male 40 positions 1 rangée (0,1") | × | 1 |
| Résistance 10k ohm | × | 1 |
| Résistance 22,1k ohm | × | 1 |
| Résistance 1k ohm | × | 1 |
| OLED 1306 Arduino | × | 1 |
Outils nécessaires
| Fer à souder (générique) |
| Pistolet à colle chaude (générique) |
| Mini Perceuse |
Applications et services en ligne
| Arduino IDE |
À propos de ce projet
L'idée
En tant que passionnés, nous avons fréquemment besoin d'alimenter nos prototypes, vérifier la tension, le courant, les limites de puissance de nos projets, tester un composant nouvellement acheté. Le besoin d'une alimentation variable est toujours présent dans ce domaine. Mais malheureusement, nous n'avons pas tous des alimentations de laboratoire/établi. C'est aussi cher si acheté, encombrant si besoin de le transporter. Je cherchais une alimentation programmable à moindre coût, avec portabilité et productivité pour alimenter mes prototypes et tester des composants. J'ai donc décidé d'en fabriquer une.
Elle possède les caractéristiques suivantes :
- Programmable
- Rechargeable
- Portable
- Tension par paliers (Step Variable)
- Voltmètre / Ampèremètre / Wattmètre
- Relais de protection
- Personnalisable, Compacte et Mignonne
- Interface Utilisateur OLED Sympa
- Contrôle Utilisateur par Bouton Poussoir et Navigation par Menus
- Firmware Mise à Jour Possible pour Plus de Fonctionnalités !
Et l'alimentation la plus polyvalente pour projets électroniques basse puissance.
En Action !
Regardez cette vidéo démontrant le fonctionnement de l'appareil :
Spécifications de l'appareil
L'appareil a les spécifications suivantes :
- Courant de Charge DC Max : 400 mA
- Plage de Tension : 2,0 Volts - 12,0 Volts
- Pas de Tension : ~0,1 Volts
- Meilleur Rendement : 75 %
- Précision Mesure Courant : +/- 1 mA
- Précision Mesure Tension : +/- 0,02 Volts
Veuillez noter que cet appareil est un prototype rapide. Il est possible de faire 0-30V, même une alimentation négative et plus de courant de sortie en utilisant des batteries de plus grande capacité, de l'électronique supplémentaire et une conception améliorée.
Principe de fonctionnement
La conception elle-même est intensive en matériel. Beaucoup de choses se passent ici. Un diagramme de blocs simplifié du système ressemble à ceci :
La source d'alimentation est la batterie Li-Po 3,7 V qui est rechargeable par USB. En utilisant un module boost DC-DC XL6009, nous faisons d'abord 15,6 volts à partir de la Li-Po. Pour faire fonctionner le MCU, nous faisons aussi un 5 Volts en utilisant le régulateur 7805.
Le clone Arduino UNO Atmega328P est connecté avec 2 interrupteurs d'entrée utilisateur basés sur interruption, un affichage OLED élégant. Port Rx/Tx/DTR pour le téléversement du firmware (sketch) via USB/Série depuis le PC. (module 1)
Le cœur du projet est le Potentiomètre Numérique MCP4131 (Digipot) + AmpliOp LM358 basé Générateur de Tension par Paliers. Cette tension est la Tension de Contrôle du Régulateur Réglable LM317. (module 2)
Le Digipot est contrôlé depuis l'Arduino via une commande de type Pseudo-SPI. Le LM317 est conçu de telle sorte que la Tension de la Broche de Sortie est toujours 1,25 Volts plus haute que la Tension de la Broche Adjust fournie que la tension de la Broche INPUT est assez haute (ici 15,6 volts). (module 3)
La tension par paliers est envoyée à la broche Adjust pour créer une sortie variable depuis l'Arduino selon les besoins de l'utilisateur.
L'ADC mesure toutes les tensions associées à la supervision et la protection ; tension batterie, tension boostée, tension de détection de charge et tension de sortie sont conditionnées par un réseau diviseur de tension pour s'adapter à la plage de l'ADC, qui est 0-1,1 volts ici. J'ai utilisé la RÉFÉRENCE INTERNE de l'Arduino qui crée une tension de référence de 1,1 volts.
Pour la détection de courant, le retour (Masse Charge) depuis la Charge de Sortie est connecté en série avec une Résistance de Détection de Courant de 1 Ohm à la Masse Système. Quand le courant traverse les charges externes, il y a aussi une chute de tension dans cette résistance de détection. Cette tension est amplifiée par l'Amplificateur Opérationnel de Précision OP07 et envoyée à l'une des broches ADC.
Enfin, pour la charge de la batterie, 5 volts depuis l'USB est connecté en série avec une diode 4007 et une résistance limitatrice de courant de 5 ohms à la batterie Li-Po. C'est une méthode de charge basique, pas la meilleure pour la charge Li-Po.
Résumé du fonctionnement : Le Potentiomètre Numérique MCP4131 crée des tensions par paliers dans la plage 0-5 Volts par pas d'environ 40mV (Digipot 10K 7-bit a 129 pas 5V/128 = 0,04 V), qui est ensuite amplifiée 2,5 fois par le LM358 donnant une plage de tension de contrôle 0-12,5 volts avec des pas de 0,1 volt. Ce signal de tension par paliers amplifié est envoyé à la broche Adjust du LM317. Le LM317 génère une tension de sortie de V_Step + 1,25 Volts qui est fournie aux charges externes. Le retour/la masse de la charge externe est connecté à la masse interne via la résistance de détection de courant de 1 Ohm. Supposons : x mA courant circule vers la charge externe, cela créera x mV de chute (Loi d'Ohm V=I*R) sur la résistance de détection de 1 Ohm. Ce petit signal de tension est envoyé à l'AmpliOp Faible Décalage (10µV) OP07 configuré avec un gain de 2,5X, qui générera 2,5x mV en sortie. L'ADC de l'Arduino est configuré avec une référence interne de 1,1 Volts de sorte que les tensions de 0 - 1100 mV puissent être détectées par pas d'environ 1mV (1100/1023). La sortie de l'OP07 est connectée à l'ADC de l'Arduino pour la détection de courant. C'est pourquoi la limite de courant est 400mA. Elle peut être augmentée/réduite en changeant le gain de l'OP07. De même, la plage de tension de sortie peut être changée en changeant la tension boostée et le gain du LM358. Les autres tensions sont mesurées avec un réseau diviseur de tension résistif atténuant les tensions pour s'adapter à la plage ADC. Le relais à verrouillage a 2 bobines. En appliquant une impulsion de puissance momentanée à l'une des bobines, les contacts du relais peuvent être commutés. Une fois commuté, il reste là, donc la bobine est mise hors tension immédiatement.
Construction du projet
D'abord, nous commençons avec une boîte de prise simple, et faisons les coupes et alignements nécessaires pour placer la batterie, le port de charge USB, l'interrupteur d'alimentation, etc.
Ensuite, le dissipateur thermique est fait avec du ruban cuivre et une pièce de monnaie pour le module boost DC-DC.
Le module boost est placé à l'intérieur de la boîte :
En utilisant les pièces ci-dessus, les 3 modules suivants sont faits :
- Module Arduino + E/S + Contrôle
- Module Générateur Tension par Paliers et Régulateur Réglable
- Module Détection de Courant
Finalement, les connexions en toile d'araignée entre toutes les cartes sont connectées et soudées.
Après utilisation de la colle chaude comme remplissage, nous l'avons enfin :
Développement du Firmware & Procédure d'Utilisation
Le firmware (Sketch Arduino) est actuellement en version 1.0.2 Beta. Toutes les fonctionnalités ne sont pas encore disponibles. Mais les fonctionnalités les plus importantes comme le contrôle de tension, la connexion/déconnexion du relais, l'affichage des informations sont activées. Dans void setup() il y a quelques fonctions d'initialisation pour chauffer les broches Arduino associées aux différents matériels externes.
ENTRÉE : Il y a 2 boutons d'entrée basés sur interruption pour augmenter/diminuer la tension de sortie, accéder au menu (non disponible sur cette version). INT0 et INT1 sur les broches Arduino 2 et 3 sont codés pour INTERRUPTION FRONT DESCENDANT. Vous verrez 2 condensateurs en parallèle avec les interrupteurs mécaniques pour l'anti-rebond. Le code est écrit pour déclencher les interruptions quand l'utilisateur appuie sur ces interrupteurs pour activer/désactiver la sortie via le relais ou augmenter/diminuer la tension (Beta).
SORTIE : L'OLED 1306 affiche les informations de sortie en acquérant les données de l'ADC, du minuteur interne (pour le temps de fonctionnement de l'appareil) et des variables de drapeau pour informer l'utilisateur sur l'état d'activation/désactivation de la sortie. Basé sur la bibliothèque U8G, l'OLED affiche les infos en texte et numérique. J'ai des plans pour utiliser une représentation graphique (type analogique).
5 broches numériques du SSD1306 (OLED de Waveshare) clk, din, cs, d/c, res sont connectées aux broches Arduino 10, 9, 11, 13, 12 et programmées en conséquence. Dans la boucle principale, la fonction update_display() est appelée à chaque fois pour mettre à jour les infos sur l'OLED.
Le Minuteur Interne 1 de l'Atmega328P est configuré pour se déclencher périodiquement toutes les 1 seconde pour suivre le temps.
CONTRÔLE : Le Potentiomètre Numérique MCP4131 est contrôlé avec les fonctions increment_digipot() & decrement_digipot() où les données sont décalées avec un horlogage et délai appropriés en utilisant les broches 6, 7, 8 comme CS, Clk, Broches Data. C'est comme un SPI logiciel lent. Comme j'avais déjà utilisé les broches SPI matérielles ailleurs, c'était la seule solution à l'époque.
Deux broches numériques 4 et 5 sont utilisées pour contrôler le relais à verrouillage. Une impulsion haute courte est envoyée aux transistors de pilotage du relais pour énergiser les 2 bobines pour basculer le relais. Cela se passe à la fois automatiquement (durant surcharge/court-circuit) ou manuellement par l'utilisateur.
ADC : La fonction calc_VI() dans la boucle principale effectue analogRead pour obtenir 20 fois la moyenne des informations de Tension et Courant et met à jour la variable pour la nouvelle information qui est ensuite affichée sur l'écran.
Le sketch est écrit dans plusieurs onglets pour organiser le code pour différentes fonctions associées à différentes opérations. Il y a les onglets ADC, Digipot, Display_Fn, Interrupt, Relay et Timer organisant toutes les fonctions définies par l'utilisateur. J'essaierai d'ajouter plus de commentaires expliquant toutes les fonctions, mais vous ne devriez pas trouver difficile à comprendre car ces fonctions sont basées sur de multiples fonctions Arduino faisant certaines tâches.
Limitations
Il y a quelques limitations sérieuses de cet appareil :
- La tension ne peut pas descendre en dessous de 2,0 V
- La sortie de tension est par paliers, pas continue
- La mesure de courant crée un décalage de masse pour les forts courants
- La mesure ADC a une faible résolution
- Le rendement est le pire de sa catégorie à basse tension fort courant
- Charge Li-Po non standard, légèrement dangereuse
Références
Vous pouvez en apprendre plus sur chaque composant dans ces tutoriels :
- Potentiomètre rotatif
- Tutoriel bouton
Conclusion
Cette alimentation programmable m'aidera à réaliser des projets/prototypes plus efficacement. Mesure de tension, courant, puissance sans utiliser de multimètre.
Code
Alimentation Portable Programmable Arduino (Arduino) - Ver 1.0.1 avec info brochage en commentaires
// Broche Reset, D0 & D1 pour téléverser le Sketch
// Broches D9,D10,D11,D12,D13 pour contrôler l'affichage OLED
// ADC A0 pour Détection V_boost
// ADC A2 pour Détection V_batt (LiPo)
// ADC A3 pour Détection I_Output (Charge)
// ADC A4 pour Détection V_USB (Charge)
// ADC A5 pour Détection V_Output (Charge)
// Broches de pilotage des 2 bobines du Relais à Verrouillage D4 & D5
#define RC1 4
#define RC2 5
// Interrupteurs Utilisateur connectés aux broches D2 & D3
#define SW1 2
#define SW2 3
// Broches D6,D7,D8 pour Contrôle Potentiomètre Numérique
#define CS_PIN 6
#define CLK_PIN 7
#define DATA_PIN 8
volatile uint8_t Switch1 = 1;
volatile uint8_t Switch2 = 1;
float V_Out = 0.0;
float I_Out = 0.0;
float V_Bat = 0.0;
float V_Bst = 0.0;
float V_Chg = 0.0;
uint32_t time = 0;
#include "U8glib.h"
// Broches de Contrôle OLED
// SSD1306 oled waveshare(clk,din,cs,d/c,res); // CETTE LIGNE POUR WAVESHARE
U8GLIB_SSD1306_128X64 u8g(10, 9, 11, 13, 12);
void setup(void) {
// retourner l'écran, si requis
analogReference(INTERNAL);
u8g.setRot180();
button_init();
relay_init();
init_timer1();
digipot_init();
}
void loop(void) {
update_display();
calc_VI();
if (Switch1 == 0) {
rc1_latch();
Switch1 = 1;
increment_digipot();
}
if (Switch2 == 0) {
rc2_latch();
Switch2 = 1;
decrement_digipot();
}
delay(100);
}
Code Ver 1.0.1 Beta (C/C++)
Aucun aperçu (téléchargement uniquement).
Code Ver 1.0.2 Beta (C/C++)
Correction bug Alignement Texte/Boîtes
Correction bug Déclenchement Surcharge
Quelques autres bugs seront corrigés dans la prochaine version
Aucun aperçu (téléchargement uniquement).
Code Ver 1.0.3 (C/C++)
Correction bug désactivation relais sortie au démarrage
Correction bug tension de sortie auto-réglée à 5,00 V après démarrage
Aucun aperçu (téléchargement uniquement).
Schémas
Dessiné sur Tableau Blanc !
https://circuits.io/circuits/4762970-arduino-based-programmable-power-supply
Processus de fabrication
- Créer un jeu Pong classique sur Arduino UNO avec écran OLED – Tutoriel étape par étape
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Centre de contrôle d'alimentation Arduino : N-FET, P-FET, Relais et RTC
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Solutions d'alimentation optimisées pour projets Arduino
- Station météo interactive Nextion HMI avec Arduino Mega et capteurs
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Kit de Formation Arduino Complet : Mega 2560, Capteurs, Moteurs et PCB Personnalisé