C ++ Raspberry Pi Управление вводом / выводом GPIO через класс / объекты с помощью заголовочного файла - PullRequest
2 голосов
/ 17 марта 2020

Этот вопрос задается после этой темы:

Проблема объявления методов и параметров в классе с заголовком

Я пытался решить эту следующую проблему, но безуспешно.

Я использую Raspberry Pi с C ++ и пытаюсь реализовать элемент управления GPIO через класс.

Поэтому у меня есть:

  • мой основной cpp файл, в котором я вызываю объект (он работает, я в этом уверен, вы увидите) с именем "RobotControl03. cpp"
  • файл класса cpp с именем "Motorcontrol01. cpp "
  • заголовочный файл с именем" Motorcontrol01.h "

Моя цель здесь состоит в том, чтобы просто вызвать" while (1) "l oop, где состояния выходов GPIO существенно меняется только для целей тестирования. Я проверяю выход через мой осциллограф;)

Проблема в том, что он, по-видимому, работает правильно, показывает, что ожидается на экране (см. Снимок экрана внизу), но выходные контакты постоянно остаются на 0 В. : '(

Я пробовал несколько модификаций, но ничего не получалось ...

Мой код более сложен, чем то, что я здесь показываю, но я упростил его для целей тестирования, и он все равно не работает -_-

Основной файл называется "RobotControl03. cpp":

#include <iostream> //for Cout to display stuff
#include <cstdio>
#include <csignal>
#include <ctime>
#include <vector>   //for using vectors instead of arrays
#include <chrono>   //library for counting time
#include <thread>   //for multithreading
#include <termios.h>
#include <wiringPi.h>   //Raspberry pi GPIO Library
#include "RPMCounter01.h"
#include "MotorControl01.h" //looking in current dirrectory


bool RUNNING = true;    // global flag used to exit from the main loop

//###################################################################################
//  GPIO Pins definition
//###################################################################################
//int SPser = 13, SPclk = 19, SPrclk = 26; //Define the output pins used
int Motor0In = 17; //define the input pins used
int Motor1In = 18; //define the input pins used

/*int SPser = 13;
int SPclk = 19;
int SPrclk = 26; //Define the output pins used for the main shift registers
int PWMSPclk = 6;
int PWMSPrclk = 12; */

//###################################################################################
//    The array in which the different pins values will be stored
//###################################################################################
std::vector<std::vector<bool>> DataArr(16,std::vector<bool>(8, 0)); //create the array of data for the shift register. Each vector is of 8 values for the shift registers of the PWM control
//direction 0 = forward, 1 = backward. PWM = 0 is stop, over, it runs
 /* 0 = Direction   | Motor 1   8  = 
     * 1 = PWM      | Motor 1   9  = 
     * 2 = Direction    ] Motor2    10 = 
     * 3 = PWM      ] Motor2    11 = 
     * 4 =              12 = 
     * 5 =              13 = 
     * 6 =              14 = 
     * 7 =              15 = 
    */
int M0Speed = 0;
std::vector<bool> M0SpeedBin(8, 0); //Binary value of the motor speed 
int M1Speed = 0;    
std::vector<bool> M1SpeedBin(8, 0);

//###################################################################################
// Callback handler if CTRL-C signal is detected
//###################################################################################
void my_handler(int s) 
{
    std::cout << "Detected CTRL-C signal no. " << s << '\n';
    RUNNING = false;
}
//###################################################################################
//              MAIN
//###################################################################################
int main() 
{
    // Initialize wiringPi and allow the use of BCM pin numbering
    /*wiringPiSetupGpio();

    pinMode(SPser, OUTPUT);
    pinMode(SPclk, OUTPUT);
    pinMode(SPrclk, OUTPUT);
    pinMode(PWMSPclk, OUTPUT);
    pinMode(PWMSPrclk, OUTPUT);*/


    // Register a callback function to be called if the user presses CTRL-C
    std::signal(SIGINT, my_handler);

    MotorControl pouet; //Create an object, calling it pouet
    std::cout << "calling SendDataPWM " << '\n';
    pouet.SendDataPWM(DataArr); //calling the method of the object


}

Заголовочный файл называется "MotorControl01. cpp"

//###################################################################################
// Class for creating the different shift register entry data
//###################################################################################

#include <iostream> //for Cout to display stuff
#include <chrono>   //library for counting time
#include <thread>   //for multithreading
#include <vector>
#include <wiringPi.h>   //Raspberry pi GPIO Library
#include "MotorControl01.h" //looking in current dirrectory

MotorControl::MotorControl(){   //constructeur
    //std::vector<std::vector<bool>> MCDataArr(16, std::vector<bool>(8, 0));    //the vector of vectors with boolean values in it for transmitting the motors control data
    //mFrequency = 0;
    //mGPIOOutputNb = 0;
    //###################################################################################
    //  GPIO Pins definition
    //###################################################################################
    SPser = 13;
    SPclk = 19;
    SPrclk = 26; //Define the output pins used for the main shift registers
    PWMSPclk = 6;
    PWMSPrclk = 12; // define the output pins to control the PWM shift registers
}

void MotorControl::SendDataPWM(std::vector<std::vector<bool>> MCDataArr){

    // Initialize wiringPi and allow the use of BCM pin numbering
    wiringPiSetupGpio();

    //initialize the pins
    pinMode(SPser, OUTPUT);
    pinMode(SPclk, OUTPUT);
    pinMode(SPrclk, OUTPUT);
    pinMode(PWMSPclk, OUTPUT);
    pinMode(PWMSPrclk, OUTPUT);

    // copy the data of the received vecor to preserve it
    //std::vector<std::vector<bool>> EditDataArr(16, std::vector<bool>(8, 0));
    //EditDataArr = DataArr;

while (1) {
    digitalWrite(PWMSPclk, HIGH);       //after looping through every value, ticking the register to load everything on the output of the main registers
    digitalWrite(PWMSPclk, LOW);
    std::cout << "PWM SP CLK"<<  PWMSPclk <<'\n';
    digitalWrite(PWMSPrclk, HIGH);      //after looping through every value, ticking the register to load everything on the output of the PWM registers
    digitalWrite(PWMSPrclk, LOW);
    std::cout << "PWM SP R CLK"<< PWMSPrclk <<'\n';
    digitalWrite(SPclk, HIGH);      //after looping through every value, ticking the register to load everything on the output of the main registers
    digitalWrite(SPclk, LOW);
    std::cout << "SP CLK"<< SPclk<<'\n';
    digitalWrite(SPrclk, HIGH);     //after looping through every value, ticking the register to load everything on the output of the PWM registers
    digitalWrite(SPrclk, LOW);
    std::cout << "SP R CLK"<< SPrclk<<'\n';
}
}

И красивый заголовочный файл, который идет вместе с ним:

#ifndef DEF_MotorControl
#define DEF_MotorControl
#include <vector>
class MotorControl{
    public:
        MotorControl();     //Constructeur
        void SendDataPWM(std::vector<std::vector<bool>> MCDataArr);

    private:
        //std::vector<std::vector<bool>> MCDataArr;
        int mFrequency;
        int mGPIOOutputNb;
        int SPser;
        int SPclk;
        int SPrclk; //Define the output pins used for the main shift registers
        int PWMSPclk;
        int PWMSPrclk;
};

#endif

Вот результат командной строки:

Command prompt result

Я надеюсь, что я надену не нужно показывать изображение осциллографа, на котором ничего не изображено;)

Редактировать:

Для тех, кто думает, что установка порта GPIO «вкл», а затем напрямую «выкл», не дает времени чтобы достичь уровня, я делаю это с самого начала, вот ожидаемый результат:

enter image description here

Я смог отлично управлять сдвиговым регистром с ним. Только после того, как я поместил свой код в отдельные файлы, он больше не работает: (

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ 2:

У меня есть в код добавлено несколько снов:

    digitalWrite(PWMSPclk, HIGH);       
    sleep(1);
    digitalWrite(PWMSPclk, LOW);
    sleep(1);
    std::cout << "PWM SP CLK"<<  PWMSPclk <<'\n';
}   
    digitalWrite(PWMSPrclk, HIGH);  
    sleep(1);
    digitalWrite(PWMSPrclk, LOW);
    sleep(1);
    std::cout << "PWM SP R CLK"<< PWMSPrclk <<'\n';

    digitalWrite(SPclk, HIGH);      
    sleep(1);
    digitalWrite(SPclk, LOW);
    sleep(1);
    std::cout << "SP CLK"<< SPclk<<'\n';

    digitalWrite(SPrclk, HIGH); 
    sleep(1);
    digitalWrite(SPrclk, LOW);
    sleep(1);
    std::cout << "SP R CLK"<< SPrclk<<'\n';

Я перебрал только один из сигналов, он дает что-то вроде этого:

while (1) {

    //using namespace std::chrono;
    //CDelTime = 1ns; // interval at which a pin is turned HIGH/LOW

    digitalWrite(PWMSPclk, HIGH);       //after looping through every value, ticking the register to load everything on the output of the main registers
    //sleep(1);
    digitalWrite(PWMSPclk, LOW);
    //sleep(1);
    std::cout << "PWM SP CLK"<<  PWMSPclk <<'\n';
}   

enter image description here

откуда берется эта задержка 6-7 мкс?

...