質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.10%

variable or field '' declared void

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 99

gajumaru

score 5

arduinoで開発をしているのですが、

ballSensor:53:17: error: variable or field 'sendVector' declared void
 void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
                 ^
ballSensor:53:17: error: 'vectorRT_t' was not declared in this scope
ballSensor:53:39: error: 'vectorXY_t' was not declared in this scope
 void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
                                       ^
ballSensor:74:39: error: 'ballCtrl' was not declared in this scope
 void printPulseWidth(float pulseWidth[ballCtrl.numberOfBallSensors]){
                                       ^
exit status 1
variable or field 'sendVector' declared void


とエラーが出てしまいます。
どなたか解決法を教えていただけるとありがたいです。

code

//in ballSensor.ino
#include "BallSensorCtrl.hpp"

constexpr unsigned long baud = 115200;
BallSensorCtrl ballCtrl;

void setup(){
    Serial.begin(baud);
}
float pulseWidth[ballCtrl.numberOfBallSensors] = {};
int i = 0;
unsigned long long previoustTime = millis();
//vectorRT_t previousVectorRT = {};
//vectorXY_t previousVectorXY = {};

void loop(){
    float currentPulseWidth[ballCtrl.numberOfBallSensors] = {};
    ballCtrl.getPulseWidth(currentPulseWidth);

    static float rate = 0.05;
    for(int i = 0;i<12;i++){
        pulseWidth[i] = currentPulseWidth[i] * rate + pulseWidth[i] * (1 - rate);
    }
    vectorXY_t vectorXY = ballCtrl.CaluculateVectorXY(pulseWidth);
    vectorRT_t vectorRT = ballCtrl.CaluculateVectorRT(pulseWidth);

    //10msごと
    if(millis() - previoustTime > 10){
        //sendVectorRTIntBySerial(vectorRTInt);
        Serial.print("radius : ");
        Serial.print(vectorRT.radius);
        Serial.print("    theta : ");
        Serial.print(vectorRT.theta);
        //printVectorRTIntBySerial(vectorRTInt, deltaVectorXYInt);
        //printPulseWidth(pulseWidth);
        previoustTime = millis();
        //previousVectorRT = vectorRT;
        //previousVectorXY = vectorXY;
    }
    //受け取った時
    if (Serial.available()){
        char header = Serial.read();
        if(header == 'b'){
            //int a = sendVector(vectorXY,vectorRT);
            //printVectorRTIntBySerial(vectorRTInt, deltaVectorXYInt);
            //printPulseWidth(pulseWidth);
            //previousVectorRT = vectorRT;
            //previousVectorXY = vectorXY;
        }
    }
    //printPulseWidth(pulseWidth);
}

void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
    float x = vectorXYa.x;
    float y = vectorXYa.y;

    float radius = vectorRTa.radius;
    float theta = vectorRTa.theta;

    /*Serial.write('B');
    Serial.write(lowByte(radius));
    Serial.write(highByte(radius));
    Serial.write(lowByte(theta));
    Serial.write(highByte(theta));

    Serial.write(lowByte(x));
    Serial.write(highByte(x));
    Serial.write(lowByte(y));
    Serial.write(highByte(y));*/

    //return;
}

void printPulseWidth(float pulseWidth[ballCtrl.numberOfBallSensors]){
    Serial.print(" 0 : ");
    Serial.print(pulseWidth[0]);
    Serial.print(" 1 : ");
    Serial.print(pulseWidth[1]);
    Serial.print(" 2 : ");
    Serial.print(pulseWidth[2]);
    Serial.print(" 3 : ");
    Serial.print(pulseWidth[3]);
    Serial.print(" 4 : ");
    Serial.print(pulseWidth[4]);
    Serial.print(" 5 : ");
    Serial.print(pulseWidth[5]);
    Serial.print(" 6 : ");
    Serial.print(pulseWidth[6]);
    Serial.print(" 7 : ");
    Serial.print(pulseWidth[7]);
    Serial.print(" 8 : ");
    Serial.print(pulseWidth[8]);
    Serial.print(" 9 : ");
    Serial.print(pulseWidth[9]);
    Serial.print(" 10 : ");
    Serial.print(pulseWidth[10]);
    Serial.print(" 11 : ");
    Serial.print(pulseWidth[11]);
    Serial.println();
}
//in BallSensorCtrl.cpp
#include <digitalWriteFast.h>
#include "BallSensorCtrl.hpp"

void BallSensorCtrl::setupSensors(){
    pinMode(BallSensorPins[0],INPUT);
    pinMode(BallSensorPins[1],INPUT);
    pinMode(BallSensorPins[2],INPUT);
    pinMode(BallSensorPins[3],INPUT);
    pinMode(BallSensorPins[4],INPUT);
    pinMode(BallSensorPins[5],INPUT);
    pinMode(BallSensorPins[6],INPUT);
    pinMode(BallSensorPins[7],INPUT);
    pinMode(BallSensorPins[8],INPUT);
    pinMode(BallSensorPins[9],INPUT);
    pinMode(BallSensorPins[10],INPUT);
    pinMode(BallSensorPins[11],INPUT);
}

void BallSensorCtrl::getPulseWidth(float pulseWidth[numberOfBallSensors]){
    uint16_t timeLimit = IRBallWaveformModeA;

    unsigned long startTime_us = micros();
    do{
        //全センサを同時読み
        for (int i = 0; i < numberOfBallSensors/2; i++){
            if (digitalReadFast(BallSensorPins[i]) == false)
            {
                pulseWidth[i] += deltaPulseWidth;
            }
        }
    } while ((micros() - startTime_us) < timeLimit);
    startTime_us = micros();
    do{
        //全センサを同時読み
        for (int i = numberOfBallSensors/2; i < numberOfBallSensors; i++){
            if (digitalReadFast(BallSensorPins[i]) == false)
            {
                pulseWidth[i] += deltaPulseWidth;
            }
        }
    } while ((micros() - startTime_us) < timeLimit);

    return;
}

vectorXY_t BallSensorCtrl::CaluculateVectorXY(float pulseWidth[numberOfBallSensors]){
    vectorXY_t result;
    result.x = 0;
    result.y = 0;
    for(int i = 0;i<numberOfBallSensors;i++){
        result.x += pulseWidth[i] * UnitVectorX[i];
        result.y += pulseWidth[i] * UnitVectorY[i];
    }
    /*if(result.x != 0 || result.y != 0){
        float squared = result.x * result.x + result.y * result.y;
        float root = sqrt(squared);
        result.x /= root;
        result.y /= root;
    }*/
    return result;
}

vectorRT_t BallSensorCtrl::CaluculateVectorRT(float pulseWidth[numberOfBallSensors]){
    vectorRT_t returnValue;
    vectorXY_t result;
    result.x = 0;
    result.y = 0;
    float pulseWidthSum = 0;
    for(int i = 0;i<numberOfBallSensors;i++){
        result.x += pulseWidth[i] * UnitVectorX[i];
        result.y += pulseWidth[i] * UnitVectorY[i];
        pulseWidthSum += pulseWidth[i];
    }
    float sqrtRadius = sqrt(pulseWidthSum);
    float cube = pulseWidthSum * sqrtRadius;
    float rate;
    if (cube > 0.0001)
        rate = 1 / cube * 500;
    else
        rate = 0;
    result.x *= rate;
    result.y *= rate;
    returnValue.theta = atan2(result.x,result.y);
    returnValue.radius = result.x * result.x + result.y * result.y;
    returnValue.radius /= 100;

    return returnValue;
}
//in BallSensorCtrl.hpp
#ifndef BallCtrl_h
#define BallCtrl_h

typedef struct{
    float radius;
    float theta;
} vectorRT_t;

typedef struct{
    float x;
    float y;
} vectorXY_t;

class BallSensorCtrl{
    public:
        static constexpr int numberOfBallSensors = 12;

        void setupSensors();
        void getPulseWidth(float pulseWidth[numberOfBallSensors]);
        vectorXY_t CaluculateVectorXY(float pulseWidth[numberOfBallSensors]);
        vectorRT_t CaluculateVectorRT(float pulseWidth[numberOfBallSensors]);

        //センサーのピン番号 今
        //uint8_t BallSensorPins[numberOfBallSensors] = {9, 8, 7, 6, 5, 4, 3, 2, A2, A1, A0, 10};
        //昔
        uint8_t BallSensorPins[numberOfBallSensors] =
        {A2, A1, 9, A0, 8, 5, 4, 3, 2, A5, A4, A3};
    private:
        static constexpr uint16_t IRBallWaveformModeA = 833;

        static constexpr float deltaPulseWidth     = 1.0;

        float UnitVectorX[numberOfBallSensors] = {0.000, 0.500, 0.866, 1.000, 0.866, 0.500, 0.000, -0.500, -0.866, -1.000, -0.866, -0.500};

        float UnitVectorY[numberOfBallSensors] = {1.000, 0.866, 0.500, 0.000, -0.500, -0.866, -1.000, -0.866, -0.500, 0.000, 0.500, 0.866};
};
#endif
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

BallSensorCtrl.cpp
BallSensorCtrl.hpp
は、ballSensor.ino と同じフォルダに置き #include <Arduino.h> を追加しコンパイル確認しました

digitalWriteFast.h は、ライブラリ追加が必要です。

//in BallSensorCtrl.cpp
#include <Arduino.h>
#include <digitalWriteFast.h>
#include "BallSensorCtrl.hpp"

//in BallSensorCtrl.hpp
#include <Arduino.h>
#ifndef BallCtrl_h
#define BallCtrl_h

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ballSensor:53:17: error: 'vectorRT_t' was not declared in this scope
ballSensor:53:39: error: 'vectorXY_t' was not declared in this scope

vectorRT_t とvectorXY_tの定義がない、というエラーです
これらの定義はどこにあるんでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/09 22:41

    codeの三番目のBallSensorCtrl.hppというところにあります。

    キャンセル

  • 2019/10/09 22:50

    ならそれをインクルードさせましょうよ

    キャンセル

  • 2019/10/09 22:54

    私の説明に足らないところがあってすいません。
    一番上がメインプログラムで、
    一番下がヘッダファイル、
    真ん中がヘッダファイル内の関数を定義しているファイルです。
    一番上のメインプログラムでヘッダファイルをインクルードしています。
    #include "BallSensorCtrl.hpp"の部分です

    また、メインプログラムの他のところでは、vectorRT_t,vectorXY_tは使うことができています。
    なのにも関わらず、関数の引数に用いる時だけエラーが出てしまいます。

    キャンセル

  • 2019/10/09 22:56

    だけど、コンパイラはそのエラーを出しているってことですね。
    違うファイルをインクルードしているか、そのファイルが無効になっているか、あなたがなにか勘違いしているかのどれかですね

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる