The KY010 Photo Interrupter module is a very inexpensive way to sense whether a physical path has an interruption. This could be used to sense the rotation of a wheel, provided that the outside of the wheel had openings and closing which fit into the slot of the KY010. I have not been able to track down the data sheet for the part or the breakout board. Its sold very inexpensively (appx 68 cents on AliExpress). The depth of the slot is about 1/8″ and the width is about 1/16″.

There appear to be two resistors on the module. One is used to forward bias an LED and the other is the load resistor for the photo sensing transistor.

Connecting the module to an Arduino is very simple. In the below picture, GND is connected to the breakout board and the S labeled pin is connected to GPIO2. The power supply provides +5 volts to the board.

static int PhotoInterrupterState;
const int  PhotoInterrupterGPIO = 2;

// 1 = photosensor beam interrupted
int GetPhotoInterruperState(void)
{
  static bool isInited;

  if (!isInited)
  {
    isInited = true;
    pinMode(PhotoInterrupterState, INPUT);
    PhotoInterrupterState = GetPhotoInterruperState();
  }

  return digitalRead(PhotoInterrupterGPIO);
}

void setup()
{
  Serial.begin(9600);
  Serial.println("hello world");
}

void loop()
{
  int newState  = GetPhotoInterruperState();
  if (newState != PhotoInterrupterState)
  {
    Serial.println(newState);
    PhotoInterrupterState = newState;
  }
}

Another similar device was found on the Digikey web site, https://www.digikey.com/en/products/detail/nte-electronics-inc/NTE3102/11650284. Note that at the time of this writing, this Digikey part sold for about $6(!) at quantity 1, but there is at least a data sheet for the Digikey part.