0

私はArduinoで作業しており、Arduinoライブラリで処理しています。

bitWrite(byte, int, int)「関数が存在しません。」というエラーが表示されます。処理+ArduinobitWrite関数が一緒に機能していないことを示しています。この行のために発生しました:

arduino.bitWrite(data,desiredPin,desiredState);

このプロジェクトでの私の目標は、シフトレジスタで動作するように音楽リアクティブスケッチを変更することです。

これが私の完全なコードです:

Arduino_Shift_display

import ddf.minim.*;
import ddf.minim.analysis.*;
import processing.serial.*;
import cc.arduino.*;

int displayNum = 8;

Arduino arduino;
//Set these in the order of frequency - 0th pin is the lowest frequency,
//while the final pin is the highest frequency
int[] lastFired = new int[displayNum];

int datapin = 2; 
int clockpin = 3;
int latchpin = 4;
int switchpin = 7;

byte data = 0;

//Change these to mess with the flashing rates
//Sensitivity is the shortest possible interval between beats
//minTimeOn is the minimum time an LED can be on
int sensitivity = 75;
int minTimeOn = 50;

String mode;
String source;

Minim minim;
AudioInput in;
AudioPlayer song;
BeatDetect beat;

//Used to stop flashing if the only signal on the line is random noise
boolean hasInput = false;
float tol = 0.005;

void setup(){
  // shift register setup
  arduino.pinMode(datapin, arduino.OUTPUT);
  arduino.pinMode(clockpin, arduino.OUTPUT);  
  arduino.pinMode(latchpin, arduino.OUTPUT);
  arduino.digitalWrite(switchpin, arduino.HIGH);

  //Uncomment the mode/source pair for the desired input

  //Shoutcast radio stream
  //mode = "radio";
  //source = "http://scfire-ntc-aa05.stream.aol.com:80/stream/1018";

  //mode = "file";
  //source = "/path/to/mp3";

  mode = "mic";
  source = "";

  size(512, 200, P2D);

  minim = new Minim(this);
  arduino = new Arduino(this, Arduino.list()[1]);


  minim = new Minim(this);

  if (mode == "file" || mode == "radio"){
    song = minim.loadFile(source, 2048);
    song.play();
    beat = new BeatDetect(song.bufferSize(), song.sampleRate());
    beat.setSensitivity(sensitivity);
  } else if (mode == "mic"){
    in = minim.getLineIn(Minim.STEREO, 2048);
    beat = new BeatDetect(in.bufferSize(), in.sampleRate());
    beat.setSensitivity(sensitivity);
  }
}

void shiftWrite(int desiredPin, int desiredState)

// This function lets you make the shift register outputs
// HIGH or LOW in exactly the same way that you use digitalWrite().

// Like digitalWrite(), this function takes two parameters:

//    "desiredPin" is the shift register output pin
//    you want to affect (0-7)

//    "desiredState" is whether you want that output
//    to be HIGH or LOW

// Inside the Arduino, numbers are stored as arrays of "bits",
// each of which is a single 1 or 0 value. Because a "byte" type
// is also eight bits, we'll use a byte (which we named "data"
// at the top of this sketch) to send data to the shift register.
// If a bit in the byte is "1", the output will be HIGH. If the bit
// is "0", the output will be LOW.

// To turn the individual bits in "data" on and off, we'll use
// a new Arduino commands called bitWrite(), which can make
// individual bits in a number 1 or 0.
{
  // First we'll alter the global variable "data", changing the
  // desired bit to 1 or 0:

  arduino.bitWrite(data,desiredPin,desiredState);

  // Now we'll actually send that data to the shift register.
  // The shiftOut() function does all the hard work of
  // manipulating the data and clock pins to move the data
  // into the shift register:

  arduino.shiftOut(datapin, clockpin, MSBFIRST, data);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                


  // Once the data is in the shift register, we still need to
  // make it appear at the outputs. We'll toggle the state of
  // the latchPin, which will signal the shift register to "latch"
  // the data to the outputs. (Latch activates on the high-to
  // -low transition).

  arduino.digitalWrite(latchpin, arduino.HIGH);
  arduino.digitalWrite(latchpin, arduino.LOW);
}

void draw(){
  if (mode == "file" || mode == "radio"){
    beat.detect(song.mix);
    drawWaveForm((AudioSource)song);
  } else if (mode == "mic"){
    beat.detect(in.mix); 
    drawWaveForm((AudioSource)in);
  }

  if (hasInput){ //hasInput is set within drawWaveForm
    for (int i=0; i<displayNum-1; i++){
      if ( beat.isRange( i+1, i+1, 1) ){
        shiftWrite(i, 1);
        lastFired[i] = millis();
      } else {
        if ((millis() - lastFired[i]) > minTimeOn){
          shiftWrite(i, 0);
        }
      }
    } 
  }
}  //End draw method

//Display the input waveform
//This method sets 'hasInput' - if any sample in the signal has a value
//larger than 'tol,' there is a signal and the lights should flash.
//Otherwise, only noise is present and the lights should stay off.
void drawWaveForm(AudioSource src){
  background(0);
  stroke(255);

  hasInput = false;

  for(int i = 0; i < src.bufferSize() - 1; i++)
  {
    line(i, 50 + src.left.get(i)*50, i+1, 50 + src.left.get(i+1)*50);
    line(i, 150 + src.right.get(i)*50, i+1, 150 + src.right.get(i+1)*50);

    if (!hasInput && (abs(src.left.get(i)) > tol || abs(src.right.get(i)) > tol)){
      hasInput = true;
    }
  } 
}

void resetPins(){
  for (int i=0; i<ledPins.length; i++){
    arduino.digitalWrite(ledPins[i], Arduino.LOW);   
  } 
}

void stop(){
  resetPins();  
  if (mode == "mic"){
    in.close();
  }  
  minim.stop();
  super.stop();
}

BeatListener

class BeatListener implements AudioListener
{
  private BeatDetect beat;
  private AudioPlayer source;

  BeatListener(BeatDetect beat, AudioPlayer source)
  {
    this.source = source;
    this.source.addListener(this);
    this.beat = beat;
  }

  void samples(float[] samps)
  {
    beat.detect(source.mix);
  }

  void samples(float[] sampsL, float[] sampsR)
  {
    beat.detect(source.mix);
  }
}
4

2 に答える 2

2

標準のビット演算子を使用して同じことを実現できます。少しオンにするには:

data |= 1 << bitNumber;

右側(1 << bitNumber)は、適切なビットマスクを作成するためのビットシフト操作です。単一の「1」ビットを取得し、目的の位置に到達するまで左に移動します。ビットごとの割り当て(|=)は、その新しいビットマスクをの既存のビットと組み合わせますdata。これにより、目的のビットがオンになりますが、残りは変更されません。

少しオフにするコードは少し異なります:

data &= ~(1 << bitNumber);

ここで同じビットシフト操作を見ることができます。ただし、その前に単項否定演算子(~)があります。これにより、すべての1が0に、すべての0が1に交換されます。結果は、以前に使用したビットマスクとは正反対です。ビット単位で実行することはできません。ただし、今回は操作を実行します。そうしないと、他のすべてのビットがオンになります。代わりに、ビット単位の割り当て( )を使用して、このマスクを変数&=と組み合わせます。dataこれにより、目的のビットがオフになり、残りは変更されません。

あなたのコードでdesiredPinは、はと同等ですbitNumber

ビット演算がどのように機能するかについての完全な説明は、かなり長くなる可能性があります。さらにヘルプが必要な場合は、オンラインで優れたチュートリアルを探すことをお勧めします。

于 2013-11-02T01:32:24.097 に答える
0

また、ビットシフトやandの使用よりもコードを少し読みやすくするArduinoマクロもbitSetあります。形式はとのいずれかです。これらは非常に効率的なコードに変換され、変数とハードウェアレジスタの両方を操作するために使用できます。したがって、たとえば、Arduino UNOのピン13をオンにする場合は、最初にArduinoピン13が実際にはAtmelatmega328チップのPORTBのピン5であることを確認する必要があります。したがって、コマンドは次のようになります。bitClearANDORbitSet(what_to_modify,bit_number)bitClear(what_to_modify,bit_number)

bitSet(PORTB,5);
于 2015-06-11T22:39:35.277 に答える