Arduino PWM ventilátor 4 wire
Arduino PWM ventilátor 4 wire
Zdravím. Hledám jednoduché a jasné řešení pro arduino (bude to NANO s shieldem ). pro řízení PWM ventilátoru 4 wire konkrétně tohohle. Našel jsme několik různých řešení ale protože se tolik v elektrice nevyznám abych zapojoval nějaké tranďáky tak hledám hotové řešení. To co potřebuji je aby arduino řídilo ventilátor na co nejnižší otáčky a v případě, až dostane pokyn po I2C tak zvýší otáčky na maximum a když dostane další pokyn zase je sníží. Nebude se to řídit teplem ale událostí. Bude to vyfukovat mlhu z mlhovače. A aby nešla vlhkost do skříně pod teráriem tak aspoň ty minimální otáčky co poženou vlhkost pryč. Našel jsme několik PWM hotových řešení. Adafruit 24-Channel 12-bit PWM LED Driver - SPI Interface - TLC5947 nebo Adafruit 12-Channel 16-bit PWM LED Driver - SPI Interface - TLC59711 nebo Modulový driver servo motoru pro Arduino - PCA9685 16 kanálů 12-bit PWM nebo řešení s touto sestavou NodeMCU Motor Shield Board L293D for ESP-12E from ESP8266. Nebo existuje něco jiného už hotového ? Díky všem za radu. Celkem to spěchá.
Nebo je efektivnější řešení L298N a obyčejná 2 wire PC ventilátor?
Nebo je efektivnější řešení L298N a obyčejná 2 wire PC ventilátor?
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
Jednomu tranzistoru se asi nevyhneš. Podle kat. listu si motor bere při 12V / 90mA.
Ty další rozšiřující moduly se mi ale zdají zbytečné.
Dokonce by se to celý možná dalo nacpat do jednoho ATtiny85.
- dva piny na I2C
- jeden PWM výstup
- jeden vstup od testování, jestli se motor točí
- a ještě zbyde jeden nebo dva piny k nějaké signalizaci stavu / poruchy
Program by po spuštěni postupně zvyšoval PWM tak, aby se ventilátor roztočil.
Hodnota PWM by se v okamžiku, kdy začnou chodit impulzy z čidla otáčení, někam poznamenala.
Zapnul by se watchdog, který by byl občerstvovaný impulzy z čidla otáček.
V hlavní smyčce by se pak na I2C testoval příjem nějakého příkazu (čísla).
Jeden příkaz by pustil PWM na 100%.
Druhý příkaz by přepnul PWM na hodnotu, která byla zjištěna při startu.
Neustále by se testovalo, že od čidla otáčení chodí impulzy (občersvování watchdogu).
Když by impulzy ustaly (motor se přidřel) provedl by se automatický reset s novým nalezením minimálního PWM potřebného k točení.
Když by bylo zadření motoru trvalé, tak by se po do dosažení 100% PWM ve startovací fázi rozpískal pípák na signalizačním pinu.
Ty další rozšiřující moduly se mi ale zdají zbytečné.
Dokonce by se to celý možná dalo nacpat do jednoho ATtiny85.
- dva piny na I2C
- jeden PWM výstup
- jeden vstup od testování, jestli se motor točí
- a ještě zbyde jeden nebo dva piny k nějaké signalizaci stavu / poruchy
Program by po spuštěni postupně zvyšoval PWM tak, aby se ventilátor roztočil.
Hodnota PWM by se v okamžiku, kdy začnou chodit impulzy z čidla otáčení, někam poznamenala.
Zapnul by se watchdog, který by byl občerstvovaný impulzy z čidla otáček.
V hlavní smyčce by se pak na I2C testoval příjem nějakého příkazu (čísla).
Jeden příkaz by pustil PWM na 100%.
Druhý příkaz by přepnul PWM na hodnotu, která byla zjištěna při startu.
Neustále by se testovalo, že od čidla otáčení chodí impulzy (občersvování watchdogu).
Když by impulzy ustaly (motor se přidřel) provedl by se automatický reset s novým nalezením minimálního PWM potřebného k točení.
Když by bylo zadření motoru trvalé, tak by se po do dosažení 100% PWM ve startovací fázi rozpískal pípák na signalizačním pinu.
Re: Arduino PWM ventilátor 4 wire
To je pro mě složitý. Vyřeším to na 98% pomocí Arduino NANO + L298N + ventilátor z PC s 2 wire. Obyčejný. A když odejde tak nasadím další a pak další a pak další..Mám jich krabici ze starých pc. Potřeboval bych ale poradit s kodem na arduino.
tohle je kód co mi funguje na komunikaci mezi NANO a rpi. Na pokyn z rpi zasláním 1 se rozvítí led dioda, když příjde 0 tak dikda zhasne. Potřeboval bych upravit kod aby místo diody se na 1 spustil příkaz 1 a na příchozí 0 zase příkaz 0 (místo 1 je "void naplno()" a místo 0 je "void pomalu()". Poradíte mi někdo jak to upravit?
Kód: Vybrat vše
// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
// 04-Feb-2018 mcarter adapted
#include <Wire.h>
const int ledPin = 13; // onboard LED
static_assert(LOW == 0, "Expecting LOW to be 0");
void setup() {
Wire.begin(0x8); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // turn it off
}
void loop() {
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
digitalWrite(ledPin, c);
}
}
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
Nemám to teď na čem vyzkoušet ale mohlo by to být nějak takhle:
Na začátku nastavit jiný pin (PWM se dá generovat jen na některých pinech Arduina):
V setupu změnit příkaz pro vypnutí:
A pak v hlavní smyčce nahradit původní řádku:
těmito dvěma podmínkami:
Spínací FET by pak byl ovládaný pinem 3.
Na začátku nastavit jiný pin (PWM se dá generovat jen na některých pinech Arduina):
Kód: Vybrat vše
const int ledPin = 3;
V setupu změnit příkaz pro vypnutí:
Kód: Vybrat vše
analogWrite(ledPin, 0); // turn it off
A pak v hlavní smyčce nahradit původní řádku:
Kód: Vybrat vše
digitalWrite(ledPin, c);
těmito dvěma podmínkami:
Kód: Vybrat vše
if (c == '1') analogWrite(ledPin, 255); // zapnout na 100%
if (c == '0') analogWrite(ledPin, 26); // zapnout na 10% (tohle číslo by se muselo vyzkoušet aby dokázalo roztočit ventilátor)
Re: Arduino PWM ventilátor 4 wire
Díky. Chci propojit tak kod co jsem dal s tímto:
Prostě na začátku nastavit minimální rychlost. Po obdržení 1 vyvolat událost naplno() a když dostane 0 tak vyvolat událost pomalu(). Ta knihovna používá jednoduché a logické příkazy.
Kód: Vybrat vše
#include <L298N.h>
// zapojeni L298N na a.nano
const unsigned int IN1 = 7;
const unsigned int IN2 = 8;
const unsigned int EN = 9;
// Vytvořte jednu instanci motoru
L298N motor(EN, IN1, IN2);
void setup() {
Serial.begin(9600);
motor.setSpeed(70);
Wire.begin(0x8); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // turn it off
}
void loop() {
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
digitalWrite(ledPin, c);
}
}
// motor na plny vykon
void naplno(){
motor.setSpeed(255);
printSomeInfo();
}
// motor pomalu
void pomalu(){
motor.setSpeed(70);
printSomeInfo();
}
/*
Print some informations in Serial Monitor
*/
void printSomeInfo()
{
Serial.print("Motor is moving = ");
Serial.print(motor.isMoving());
Serial.print(" at speed = ");
Serial.println(motor.getSpeed());
}
Prostě na začátku nastavit minimální rychlost. Po obdržení 1 vyvolat událost naplno() a když dostane 0 tak vyvolat událost pomalu(). Ta knihovna používá jednoduché a logické příkazy.
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
Takže jestli to chápu tak by tahle funkce co to celé rozhoduje mohla vypadat takto:
Kód: Vybrat vše
void receiveEvent(int howMany) {
while (Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
if (c == '1') naplno();
if (c == '0') pomalu();
}
}
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
našel jsem jiné řešení komunikace mezi arduinem a rpi, trochu upravené: doplnil jsem tam podmínku ale nefunguje
podmínky jsem zatím nepotřeboval tak nevím kde dělám chybu...
Kód: Vybrat vše
char c;
int x;
void receiveEvent(int howMany)
{
while (1 < Wire.available()) // loop through all but the last
{
c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
if (c == "1") {
naplno();
}
else if (c == "0") {
pomalu();
}
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x);
}
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
Určitě je chyba v dvojitých uvozovkách kolem 1 a 0.
Tam mají být apostrofy.
A proč je tam tohle?:
Jinak nevím. Nemůžu si to teď vyzkoušet.
Tam mají být apostrofy.
A proč je tam tohle?:
Kód: Vybrat vše
int x = Wire.read(); // receive byte as an integer
Serial.println(x);
Jinak nevím. Nemůžu si to teď vyzkoušet.
Re: Arduino PWM ventilátor 4 wire
ASI VYŘEŠENO:
a tohle je původni kod z raspberry, ten vykuchám a použiju co potřebuju.
Kód: Vybrat vše
/*
* kod pro rizeni otacek ventilatoru, pokyny dostava z raspberry cestou I2C
* Wiring schema in file "L298N - Schema_with_EN_pin.png"
* Source : https://github.com/AndreaLombardo/L298N/
*
*/
#include <Wire.h>
#include <L298N.h>
//const int ledPin = 13; // onboard LED
//static_assert(LOW == 0, "Expecting LOW to be 0");
char c;
int x;
// zapojeni L298N na a.nano
const unsigned int IN1 = 7;
const unsigned int IN2 = 8;
const unsigned int EN = 9;
// Vytvořte jednu instanci motoru
L298N motor(EN, IN1, IN2);
void setup() {
Serial.begin(9600);
// Wait for Serial Monitor to be opened
while (!Serial)
{
Serial.print("Startuji rizeni ventilatoru a komunikaci s raspberry");
}
// Set initial speed
motor.setSpeed(70);
printSomeInfo();
Wire.begin(0x8); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
//pinMode(ledPin, OUTPUT);
//digitalWrite(ledPin, LOW); // turn it off
}
void loop() {
delay(100);
}
/*
Print some informations in Serial Monitor
*/
void printSomeInfo()
{
Serial.print("Motor is moving = ");
Serial.print(motor.isMoving());
Serial.print(" at speed = ");
Serial.println(motor.getSpeed());
}
// motor na plny vykon
void naplno(){
Serial.println("Start motoru NAPLNO");
motor.setSpeed(255);
printSomeInfo();
}
// motor pomalu
void pomalu(){
Serial.println("Zase pomale otacky");
motor.setSpeed(70);
printSomeInfo();
}
void receiveEvent(int howMany)
{
while (1 < Wire.available()) // loop through all but the last
{
c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x);
switch (x){
case 1:
naplno();
break;
case 0:
pomalu();
break;
}
}
////
void sendEvent()
{
Serial.print("send data\n");
Wire.write(x);
}
Kód: Vybrat vše
# Raspberry Pi Master for Arduino Slave
# i2c_master_pi.py
# Connects to Arduino via I2C
# DroneBot Workshop 2019
# https://dronebotworkshop.com
from smbus import SMBus
addr = 0x8 # bus address
bus = SMBus(1) # indicates /dev/ic2-1
numb = 1
print ("Enter 1 for ON or 0 for OFF")
while numb == 1:
ledstate = input(">>>> ")
if ledstate == "1":
bus.write_byte(addr, 0x1) # switch it on
elif ledstate == "0":
bus.write_byte(addr, 0x0) # switch it on
else:
numb = 0
/code]
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Re: Arduino PWM ventilátor 4 wire
Tak arduino NANO čeká a poslouchá na příkaz.. ale je problém s kodem v rpi.
do toho doplnění to fungovalo...
teď to hází chybu
Kód: Vybrat vše
# -*- coding:utf-8 -*-
# relay 1 , 24V mlhování, 10 minut
import RPi.GPIO as GPIO
import time
from smbus import SMBus # tohle jsem teď doplnil
addr = 0x8 # bus address # tohle jsem teď doplnil
bus = SMBus(1) # indicates /dev/ic2-1 # tohle jsem teď doplnil
Relay_Ch1 = 26
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(Relay_Ch1,GPIO.OUT)
print("Nastaveni relay modulu 1 mlhovani - [uspech]")
try:
#Control the Channel 1
GPIO.output(Relay_Ch1,GPIO.LOW)
bus.write_byte(addr, 0x1) # tohle jsem teď doplnil
print("Relay 1:oteviram, spoustim mlhovani!")
time.sleep(600.0)
GPIO.output(Relay_Ch1,GPIO.HIGH)
bus.write_byte(addr, 0x0) # tohle jsem teď doplnil
print("Relay 1:mlhovani ukonceno, vypinam\n")
time.sleep(0.5)
except:
print("except")
GPIO.cleanup()
teď to hází chybu
File "relay1.py", line 24
bus.write_byte(addr, 0x1)
^
IndentationError: unindent does not match any outer indentation level
Neexistují hloupé otázky, existují jen hloupé odpovědi.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Chci aby "chytrá" elektronika dělala "chytré" a užitečné věci. Tím není aby nahrazovala něco co se dá hotové koupit za pár korun.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti