Stránka 1 z 2

Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 10:04
od sachlj
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?

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 11:40
od AstroMiK
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.

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 11:52
od sachlj
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.

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);
  }
}
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?

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 12:17
od AstroMiK
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):

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)
Spínací FET by pak byl ovládaný pinem 3.

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 14:44
od sachlj
Díky. Chci propojit tak kod co jsem dal s tímto:

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.

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 14:46
od sachlj
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(); 
     
  }
}

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 15:13
od sachlj
našel jsem jiné řešení komunikace mezi arduinem a rpi, trochu upravené: doplnil jsem tam podmínku ale nefunguje

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);
}

podmínky jsem zatím nepotřeboval tak nevím kde dělám chybu...

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 15:28
od AstroMiK
Určitě je chyba v dvojitých uvozovkách kolem 1 a 0.
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

Napsal: 22 dub 2021, 15:31
od sachlj
ASI VYŘEŠENO:

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);
}
a tohle je původni kod z raspberry, ten vykuchám a použiju co potřebuju.

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]

Re: Arduino PWM ventilátor 4 wire

Napsal: 22 dub 2021, 15:49
od sachlj
Tak arduino NANO čeká a poslouchá na příkaz.. ale je problém s kodem v rpi.

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()
do toho doplnění to fungovalo...
teď to hází chybu
File "relay1.py", line 24
bus.write_byte(addr, 0x1)
^
IndentationError: unindent does not match any outer indentation level