Работа с мультиплексором

Dima_student
Offline
Зарегистрирован: 27.02.2014

Добрый день!  

       Ребят, подскажите пожалуйста! У меня есть необходимость управлять сервоприводами (подключены 8 серво при помощи сдвигового регистра 74HC595) при помощи фоторезисторов (их тоже 8, подключены к мультиплексору 4051)  путём преобразования процента освещённости фоторезистора в процент поворота сервопривода.

       Управляется всё то дело с Arduino Uno на базе Atmega 328. А теперь сама проблема: ардуинка имеет толь 6 аналоговых входов, мне пока что необходимо минимум 8, и поэтому стал использовать мультиплексор. Для начала просто тренировался получать на компьютер данные с контроллера (8 фоторезисторов с мультиплексором) - всё работало отлично! Но вот когда стал уже полученные значения (с фоторезисторов подключенных через мультиплексор к контроллеру) использовать в контроллере и расчитывать угол поворота сервоприводов - то одним фоторезистором я почему то управляю всеми сервоприводами.....

Вот код прошивки ардуинки:

#include <LineDriver.h>
#include <SPI.h>
#include <SPI_Bus.h>
#include <ServoExt.h>

#define S0 2    
#define S1 3    
#define S2 4  

SPI_Bus shreg(_8bit, 10);
Servo servos[8] = { &shreg, &shreg, &shreg, &shreg, &shreg, &shreg, &shreg, &shreg };

void setup ( )
{ 
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(10, OUTPUT);
  for (int i = 0; i < 8; i++)
   {
     servos[i].attach(i);
   }
  Serial.begin(9600);
}      

void loop ( ) 
{      
 for ( int i = 0 ; i < 8 ; i++)
  {
   digitalWrite(S0, (i >> 0) & 0x01);
   digitalWrite(S1, (i >> 1) & 0x01);
   digitalWrite(S2, (i >> 2) & 0x01);
   int Z = analogRead(A0);        
   int val = (Z/10.24)*1.8;
   servos[i].write(val); 
  }      
}

Помогите пожалуйста сделать управление таким что бы каждый фоторезистор управлял своим сервоприводом.

Dima_student
Offline
Зарегистрирован: 27.02.2014

Народ, кто то может помочь? 

maksim
Offline
Зарегистрирован: 12.02.2012
 for ( int i = 0 ; i < 8 ; i++)
  {
   digitalWrite(S0, (i >> 0) & 0x01);
   digitalWrite(S1, (i >> 1) & 0x01);
   digitalWrite(S2, (i >> 2) & 0x01);
   delay(5);
   int Z = analogRead(A0);        
   int val = (Z/10.24)*1.8;
   servos[i].write(val); 
  }  

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Dima_student пишет:

... - то одним фоторезистором я почему то управляю всеми сервоприводами.....

Вот код прошивки ардуинки:



...
SPI_Bus shreg(_8bit, 10);
Servo servos[8] = { &shreg, &shreg, &shreg, &shreg, &shreg, &shreg, &shreg, &shreg };
...

Что означают параметры в SPI_Bus shreg(_8bit, 10); ?

Эта команда назначает SS-slave select (CS-chip select) ?

  for (int i = 0; i < 8; i++)
20    {
21      servos[i].attach(i);
22

   }